Skip to content

Commit ef8a086

Browse files
committed
Integrate local clipboard
1 parent 144d781 commit ef8a086

File tree

1 file changed

+47
-30
lines changed
  • crates/bevy_clipboard/src

1 file changed

+47
-30
lines changed

crates/bevy_clipboard/src/lib.rs

Lines changed: 47 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
7070
impl 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
8381
impl 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

Comments
 (0)