diff options
| author | 2024-02-07 17:25:40 +0100 | |
|---|---|---|
| committer | 2024-02-13 03:14:30 +0100 | |
| commit | 4155edab8d123b767ddad67e24ca2d4c50f31ece (patch) | |
| tree | 30c81bc419920dd2e425f05caf160377b85ca961 /winit/src | |
| parent | 7615b2240c360fea21ef041bfd5b1deb73fc03d1 (diff) | |
| download | iced-4155edab8d123b767ddad67e24ca2d4c50f31ece.tar.gz iced-4155edab8d123b767ddad67e24ca2d4c50f31ece.tar.bz2 iced-4155edab8d123b767ddad67e24ca2d4c50f31ece.zip  | |
Add support for primary clipboard
Diffstat (limited to '')
| -rw-r--r-- | winit/src/application.rs | 12 | ||||
| -rw-r--r-- | winit/src/clipboard.rs | 34 | ||||
| -rw-r--r-- | winit/src/multi_window.rs | 12 | 
3 files changed, 58 insertions, 0 deletions
diff --git a/winit/src/application.rs b/winit/src/application.rs index 77e2c83e..2d3ac52c 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -715,6 +715,18 @@ pub fn run_command<A, C, E>(                      clipboard.write(contents);                  }              }, +            command::Action::ClipboardPrimary(action) => match action { +                clipboard::Action::Read(tag) => { +                    let message = tag(clipboard.read_primary()); + +                    proxy +                        .send_event(message) +                        .expect("Send message to event loop"); +                } +                clipboard::Action::Write(contents) => { +                    clipboard.write_primary(contents); +                } +            },              command::Action::Window(action) => match action {                  window::Action::Close(_id) => {                      *should_exit = true; diff --git a/winit/src/clipboard.rs b/winit/src/clipboard.rs index 8f5c5e63..a1496fa3 100644 --- a/winit/src/clipboard.rs +++ b/winit/src/clipboard.rs @@ -52,6 +52,32 @@ impl Clipboard {              State::Unavailable => {}          }      } + +    /// Reads the current content of primary as text. +    pub fn read_primary(&self) -> Option<String> { +        match &self.state { +            State::Connected(clipboard) => { +                clipboard.read_primary().and_then(|r| r.ok()) +            } +            State::Unavailable => None, +        } +    } + +    /// Writes the given text contents to primary. +    pub fn write_primary(&mut self, contents: String) { +        match &mut self.state { +            State::Connected(clipboard) => { +                match clipboard.write_primary(contents) { +                    Some(Ok(())) => {} +                    Some(Err(error)) => { +                        log::warn!("error writing to primary: {error}"); +                    } +                    None => {} +                } +            } +            State::Unavailable => {} +        } +    }  }  impl crate::core::Clipboard for Clipboard { @@ -62,4 +88,12 @@ impl crate::core::Clipboard for Clipboard {      fn write(&mut self, contents: String) {          self.write(contents);      } + +    fn read_primary(&self) -> Option<String> { +        self.read_primary() +    } + +    fn write_primary(&mut self, contents: String) { +        self.write_primary(contents); +    }  } diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 23b2f3c4..33f521c4 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -887,6 +887,18 @@ fn run_command<A, C, E>(                      clipboard.write(contents);                  }              }, +            command::Action::ClipboardPrimary(action) => match action { +                clipboard::Action::Read(tag) => { +                    let message = tag(clipboard.read_primary()); + +                    proxy +                        .send_event(message) +                        .expect("Send message to event loop"); +                } +                clipboard::Action::Write(contents) => { +                    clipboard.write_primary(contents); +                } +            },              command::Action::Window(action) => match action {                  window::Action::Spawn(id, settings) => {                      let monitor = window_manager.last_monitor();  | 
