Browse Source

Using channel to sync threads loading images

environments/review-jsparber-h-cxnwl8/deployments/1
Daniel García Moreno 9 years ago
parent
commit
9b9df299c6
  1. 27
      src/app.rs
  2. 14
      src/backend.rs

27
src/app.rs

@ -314,21 +314,22 @@ impl AppOp {
if !avatar_url.is_empty() {
let a = avatar.clone();
let fname = self.backend.get_media_async(avatar_url).unwrap();
let mut tries = 0;
let (tx, rx): (Sender<String>, Receiver<String>) = channel();
self.backend.get_media_async(avatar_url, tx).unwrap();
gtk::timeout_add(50, move || {
match Pixbuf::new_from_file_at_size(&fname, 32, 32) {
Ok(pixbuf) => {
a.set_from_pixbuf(&pixbuf);
gtk::Continue(false)
},
Err(err) => {
match tries {
i if i < 200 => gtk::Continue(true),
_ => gtk::Continue(false),
}
}
let recv = rx.try_recv();
if recv.is_err() {
return gtk::Continue(true);
}
let fname = recv.unwrap();
if let Ok(pixbuf) = Pixbuf::new_from_file_at_size(&fname, 32, 32) {
a.set_from_pixbuf(&pixbuf);
}
gtk::Continue(false)
});
}

14
src/backend.rs

@ -450,22 +450,16 @@ impl Backend {
Ok(url)
}
pub fn get_media_async(&self, url: String) -> Result<String, Error> {
pub fn get_media_async(&self, url: String, tx: Sender<String>) -> Result<(), Error> {
let base = self.get_base_url()?;
let xdg_dirs = xdg::BaseDirectories::with_prefix("guillotine").unwrap();
let re = Regex::new(r"mxc://(?P<server>[^/]+)/(?P<media>.+)")?;
let caps = re.captures(&url).ok_or(Error::BackendError)?;
let media = String::from(&caps["media"]);
let fname = String::from(xdg_dirs.place_cache_file(&media)?.to_str().ok_or(Error::BackendError)?);
let u = url.clone();
thread::spawn(move || {
thumb!(base, &u).unwrap();
let fname = thumb!(base, &u).unwrap();
tx.send(fname).unwrap();
});
Ok(fname)
Ok(())
}
}

Loading…
Cancel
Save