fix: handle slight delay in availability of clipboard data
a better fix in the future would probably be an event indicating availability of the data.
This commit is contained in:
parent
175f8ba724
commit
cf328771c3
2 changed files with 36 additions and 10 deletions
37
src/app.rs
37
src/app.rs
|
|
@ -422,6 +422,7 @@ pub enum Message {
|
||||||
CheckClipboardImage,
|
CheckClipboardImage,
|
||||||
CheckClipboardVideo,
|
CheckClipboardVideo,
|
||||||
CheckClipboardText,
|
CheckClipboardText,
|
||||||
|
RetryCheckClipboard(ClipboardCache),
|
||||||
ClipboardCached(ClipboardCache),
|
ClipboardCached(ClipboardCache),
|
||||||
PendingCancel(u64),
|
PendingCancel(u64),
|
||||||
PendingCancelAll,
|
PendingCancelAll,
|
||||||
|
|
@ -4036,9 +4037,12 @@ impl Application for App {
|
||||||
// Check if clipboard has any paste-able content and cache it
|
// Check if clipboard has any paste-able content and cache it
|
||||||
return clipboard::read_data::<ClipboardPaste>().map(|contents_opt| {
|
return clipboard::read_data::<ClipboardPaste>().map(|contents_opt| {
|
||||||
match contents_opt {
|
match contents_opt {
|
||||||
Some(contents) if !contents.paths.is_empty() => cosmic::action::app(
|
Some(contents) if contents.paths.is_empty() => cosmic::action::app(
|
||||||
Message::ClipboardCached(ClipboardCache::Files(contents)),
|
Message::RetryCheckClipboard(ClipboardCache::Files(contents)),
|
||||||
),
|
),
|
||||||
|
Some(contents) => cosmic::action::app(Message::ClipboardCached(
|
||||||
|
ClipboardCache::Files(contents),
|
||||||
|
)),
|
||||||
_ => cosmic::action::app(Message::CheckClipboardImage),
|
_ => cosmic::action::app(Message::CheckClipboardImage),
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -4071,6 +4075,28 @@ impl Application for App {
|
||||||
}))
|
}))
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Message::RetryCheckClipboard(cache) => {
|
||||||
|
let mut cmds = Vec::new();
|
||||||
|
cmds.push(self.update(Message::ClipboardCached(cache)));
|
||||||
|
|
||||||
|
cmds.push(
|
||||||
|
iced::Task::future(tokio::time::sleep(Duration::from_millis(300)))
|
||||||
|
.discard()
|
||||||
|
.chain(
|
||||||
|
clipboard::read_data::<ClipboardPaste>().map(|contents_opt| {
|
||||||
|
match contents_opt {
|
||||||
|
Some(contents) if !contents.paths.is_empty() => {
|
||||||
|
cosmic::action::app(Message::ClipboardCached(
|
||||||
|
ClipboardCache::Files(contents),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
_ => cosmic::action::app(Message::CheckClipboardImage),
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return Task::batch(cmds);
|
||||||
|
}
|
||||||
Message::ClipboardCached(cache) => {
|
Message::ClipboardCached(cache) => {
|
||||||
self.clipboard_cache = cache;
|
self.clipboard_cache = cache;
|
||||||
}
|
}
|
||||||
|
|
@ -4478,6 +4504,7 @@ impl Application for App {
|
||||||
widget::Id::unique(),
|
widget::Id::unique(),
|
||||||
)),
|
)),
|
||||||
);
|
);
|
||||||
|
commands.push(self.update(Message::CheckClipboard));
|
||||||
commands.push(self.update(Message::Surface(
|
commands.push(self.update(Message::Surface(
|
||||||
cosmic::surface::action::app_popup(
|
cosmic::surface::action::app_popup(
|
||||||
move |app: &mut Self| -> SctkPopupSettings {
|
move |app: &mut Self| -> SctkPopupSettings {
|
||||||
|
|
@ -5344,7 +5371,11 @@ impl Application for App {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
// Check clipboard when window gains focus
|
// Check clipboard when window gains focus
|
||||||
return self.update(Message::CheckClipboard);
|
// HACK: Wait a moment for the data to be available.
|
||||||
|
return cosmic::task::future(async {
|
||||||
|
_ = tokio::time::sleep(Duration::from_millis(300)).await;
|
||||||
|
cosmic::action::app(Message::CheckClipboard)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
Message::Surface(action) => {
|
Message::Surface(action) => {
|
||||||
return cosmic::task::message(cosmic::Action::Cosmic(
|
return cosmic::task::message(cosmic::Action::Cosmic(
|
||||||
|
|
|
||||||
|
|
@ -133,9 +133,7 @@ impl TryFrom<(Vec<u8>, String)> for ClipboardPaste {
|
||||||
"text/uri-list" => {
|
"text/uri-list" => {
|
||||||
let text = str::from_utf8(&data)?;
|
let text = str::from_utf8(&data)?;
|
||||||
let lines = text.lines();
|
let lines = text.lines();
|
||||||
if text.is_empty() || lines.count() == 0 {
|
|
||||||
Err(format!("Empty file url"))?;
|
|
||||||
}
|
|
||||||
for line in text.lines() {
|
for line in text.lines() {
|
||||||
let url = Url::parse(line)?;
|
let url = Url::parse(line)?;
|
||||||
match url.to_file_path() {
|
match url.to_file_path() {
|
||||||
|
|
@ -146,10 +144,7 @@ impl TryFrom<(Vec<u8>, String)> for ClipboardPaste {
|
||||||
}
|
}
|
||||||
"x-special/gnome-copied-files" => {
|
"x-special/gnome-copied-files" => {
|
||||||
let text = str::from_utf8(&data)?;
|
let text = str::from_utf8(&data)?;
|
||||||
let lines = text.lines();
|
|
||||||
if text.is_empty() || lines.count() == 0 {
|
|
||||||
Err(format!("Empty file url"))?;
|
|
||||||
}
|
|
||||||
for (i, line) in text.lines().enumerate() {
|
for (i, line) in text.lines().enumerate() {
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
kind = match line {
|
kind = match line {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue