diff options
| author | 2021-03-10 21:13:07 +0100 | |
|---|---|---|
| committer | 2021-03-10 21:13:07 +0100 | |
| commit | 7eb512774862d44772c43f9843f586bfcfa2aa89 (patch) | |
| tree | 34d64096302f59f8cb6daf35a131d8ba42f46905 /winit/src | |
| parent | 939fcfe9dbe8c08a286c6328da6053b5fd577adf (diff) | |
| parent | 17dcfa8faf68afe3cbad1151f41eb35230ef83e1 (diff) | |
| download | iced-7eb512774862d44772c43f9843f586bfcfa2aa89.tar.gz iced-7eb512774862d44772c43f9843f586bfcfa2aa89.tar.bz2 iced-7eb512774862d44772c43f9843f586bfcfa2aa89.zip  | |
Merge pull request #770 from hecrj/feature/clipboard-write
Write clipboard support and `TextInput` copy and cut behavior
Diffstat (limited to '')
| -rw-r--r-- | winit/src/application.rs | 4 | ||||
| -rw-r--r-- | winit/src/clipboard.rs | 37 | 
2 files changed, 34 insertions, 7 deletions
diff --git a/winit/src/application.rs b/winit/src/application.rs index d1a94864..2cb2c016 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -194,7 +194,7 @@ async fn run_instance<A, E, C>(      use winit::event;      let surface = compositor.create_surface(&window); -    let clipboard = Clipboard::new(&window); +    let mut clipboard = Clipboard::connect(&window);      let mut state = State::new(&application, &window);      let mut viewport_version = state.viewport_version(); @@ -237,8 +237,8 @@ async fn run_instance<A, E, C>(                  let statuses = user_interface.update(                      &events,                      state.cursor_position(), -                    clipboard.as_ref().map(|c| c as _),                      &mut renderer, +                    &mut clipboard,                      &mut messages,                  ); diff --git a/winit/src/clipboard.rs b/winit/src/clipboard.rs index 93d53b11..15dc989f 100644 --- a/winit/src/clipboard.rs +++ b/winit/src/clipboard.rs @@ -1,17 +1,44 @@  /// A buffer for short-term storage and transfer within and between  /// applications.  #[allow(missing_debug_implementations)] -pub struct Clipboard(window_clipboard::Clipboard); +pub struct Clipboard { +    state: State, +} + +enum State { +    Connected(window_clipboard::Clipboard), +    Unavailable, +}  impl Clipboard {      /// Creates a new [`Clipboard`] for the given window. -    pub fn new(window: &winit::window::Window) -> Option<Clipboard> { -        window_clipboard::Clipboard::new(window).map(Clipboard).ok() +    pub fn connect(window: &winit::window::Window) -> Clipboard { +        let state = window_clipboard::Clipboard::connect(window) +            .ok() +            .map(State::Connected) +            .unwrap_or(State::Unavailable); + +        Clipboard { state }      }  }  impl iced_native::Clipboard for Clipboard { -    fn content(&self) -> Option<String> { -        self.0.read().ok() +    fn read(&self) -> Option<String> { +        match &self.state { +            State::Connected(clipboard) => clipboard.read().ok(), +            State::Unavailable => None, +        } +    } + +    fn write(&mut self, contents: String) { +        match &mut self.state { +            State::Connected(clipboard) => match clipboard.write(contents) { +                Ok(()) => {} +                Err(error) => { +                    log::warn!("error writing to clipboard: {}", error) +                } +            }, +            State::Unavailable => {} +        }      }  }  | 
