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:
Ashley Wulber 2026-03-26 13:21:17 -04:00 committed by Jacob Kauffmann
parent 175f8ba724
commit cf328771c3
2 changed files with 36 additions and 10 deletions

View file

@ -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(

View file

@ -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 {