@@ -56,41 +56,41 @@ impl ClipboardRead {
5656 }
5757}
5858
59- /// Basic clipboard implementation that only works within the bevy app.
60- #[ derive( Resource , Default ) ]
61- pub struct ClipboardBasic ( pub String ) ;
62- // TODO: remove ClipboardNotSupported , write into ClipboardBasic instead
63-
6459/// Resource providing access to the clipboard
65- #[ cfg( unix) ]
6660#[ derive( Resource ) ]
67- pub struct Clipboard ( Option < arboard:: Clipboard > ) ;
61+ pub struct Clipboard {
62+ /// Use arboard to access host clipboard
63+ #[ cfg( unix) ]
64+ host_clipboard : Option < arboard:: Clipboard > ,
65+
66+ /// Fallback basic clipboard implementation that only works within the bevy app.
67+ local_clipboard : Option < String > ,
68+ }
6869
69- #[ cfg( unix) ]
7070impl Default for Clipboard {
7171 fn default ( ) -> Self {
72- {
73- Self ( arboard:: Clipboard :: new ( ) . ok ( ) )
72+ Clipboard {
73+ #[ cfg( unix) ]
74+ host_clipboard : arboard:: Clipboard :: new ( ) . ok ( ) ,
75+ local_clipboard : None ,
7476 }
7577 }
7678}
7779
78- /// Resource providing access to the clipboard
79- #[ cfg( not( unix) ) ]
80- #[ derive( Resource , Default ) ]
81- pub struct Clipboard ;
82-
80+ // TODO: not entirely consistent with `local_clipboard` usage, fix this
8381impl Clipboard {
8482 /// Fetches UTF-8 text from the clipboard and returns it via a `ClipboardRead`.
8583 ///
8684 /// On Windows and Unix `ClipboardRead`s are completed instantly, on wasm32 the result is fetched asynchronously.
8785 pub fn fetch_text ( & mut self ) -> ClipboardRead {
8886 #[ cfg( unix) ]
8987 {
90- ClipboardRead :: Ready ( if let Some ( clipboard) = self . 0 . as_mut ( ) {
88+ ClipboardRead :: Ready ( if let Some ( clipboard) = self . host_clipboard . as_mut ( ) {
9189 clipboard. get_text ( ) . map_err ( ClipboardError :: from)
9290 } else {
93- Err ( ClipboardError :: ClipboardNotSupported )
91+ self . local_clipboard
92+ . clone ( )
93+ . ok_or ( ClipboardError :: ContentNotAvailable )
9494 } )
9595 }
9696
@@ -118,24 +118,34 @@ impl Clipboard {
118118 } ) ;
119119 ClipboardRead :: Pending ( shared_clone)
120120 } else {
121- ClipboardRead :: Ready ( Err ( ClipboardError :: ClipboardNotSupported ) )
121+ ClipboardRead :: Ready (
122+ self . local_clipboard
123+ . clone ( )
124+ . ok_or ( ClipboardError :: ContentNotAvailable ) ,
125+ )
122126 }
123127 }
124128
125129 #[ cfg( not( any( unix, windows, target_arch = "wasm32" ) ) ) ]
126130 {
127- ClipboardRead :: Ready ( Err ( ClipboardError :: ClipboardNotSupported ) )
131+ ClipboardRead :: Ready (
132+ self . local_clipboard
133+ . clone ( )
134+ . ok_or ( ClipboardError :: ContentNotAvailable ) ,
135+ )
128136 }
129137 }
130138
131139 /// Asynchronously retrieves UTF-8 text from the system clipboard.
132140 pub async fn fetch_text_async ( & mut self ) -> Result < String , ClipboardError > {
133141 #[ cfg( unix) ]
134142 {
135- if let Some ( clipboard) = self . 0 . as_mut ( ) {
143+ if let Some ( clipboard) = self . host_clipboard . as_mut ( ) {
136144 clipboard. get_text ( ) . map_err ( ClipboardError :: from)
137145 } else {
138- Err ( ClipboardError :: ClipboardNotSupported )
146+ self . local_clipboard
147+ . clone ( )
148+ . ok_or ( ClipboardError :: ContentNotAvailable )
139149 }
140150 }
141151
@@ -164,7 +174,9 @@ impl Clipboard {
164174
165175 #[ cfg( not( any( unix, windows, target_arch = "wasm32" ) ) ) ]
166176 {
167- Err ( ClipboardError :: ClipboardNotSupported )
177+ self . local_clipboard
178+ . clone ( )
179+ . ok_or ( ClipboardError :: ContentNotAvailable )
168180 }
169181 }
170182
@@ -179,10 +191,13 @@ impl Clipboard {
179191 ) -> Result < ( ) , ClipboardError > {
180192 #[ cfg( unix) ]
181193 {
182- if let Some ( clipboard) = self . 0 . as_mut ( ) {
194+ if let Some ( clipboard) = self . host_clipboard . as_mut ( ) {
183195 clipboard. set_text ( text) . map_err ( ClipboardError :: from)
184196 } else {
185- Err ( ClipboardError :: ClipboardNotSupported )
197+ let k: alloc:: borrow:: Cow < ' a , str > = text. into ( ) ;
198+ let j: String = k. into ( ) ;
199+ self . local_clipboard = Some ( j) ;
200+ Ok ( ( ) )
186201 }
187202 }
188203
@@ -202,13 +217,19 @@ impl Clipboard {
202217 } ) ;
203218 Ok ( ( ) )
204219 } else {
205- Err ( ClipboardError :: ClipboardNotSupported )
220+ let k: alloc:: borrow:: Cow < ' a , str > = text. into ( ) ;
221+ let j: String = k. into ( ) ;
222+ self . local_clipboard = Some ( j) ;
223+ Ok ( ( ) )
206224 }
207225 }
208226
209227 #[ cfg( not( any( unix, windows, target_arch = "wasm32" ) ) ) ]
210228 {
211- Err ( ClipboardError :: ClipboardNotSupported )
229+ let k: alloc:: borrow:: Cow < ' a , str > = text. into ( ) ;
230+ let j: String = k. into ( ) ;
231+ self . local_clipboard = Some ( j) ;
232+ Ok ( ( ) )
212233 }
213234 }
214235}
@@ -220,9 +241,6 @@ pub enum ClipboardError {
220241 /// Clipboard contents were unavailable or not in the expected format.
221242 ContentNotAvailable ,
222243
223- /// No suitable clipboard backend was available
224- ClipboardNotSupported ,
225-
226244 /// Clipboard access is temporarily locked by another process or thread.
227245 ClipboardOccupied ,
228246
@@ -244,7 +262,6 @@ impl From<arboard::Error> for ClipboardError {
244262 fn from ( value : arboard:: Error ) -> Self {
245263 match value {
246264 arboard:: Error :: ContentNotAvailable => ClipboardError :: ContentNotAvailable ,
247- arboard:: Error :: ClipboardNotSupported => ClipboardError :: ClipboardNotSupported ,
248265 arboard:: Error :: ClipboardOccupied => ClipboardError :: ClipboardOccupied ,
249266 arboard:: Error :: ConversionFailure => ClipboardError :: ConversionFailure ,
250267 arboard:: Error :: Unknown { description } => ClipboardError :: Unknown { description } ,
0 commit comments