diff options
author | qkzk <qu3nt1n@gmail.com> | 2024-02-27 22:15:59 +0100 |
---|---|---|
committer | qkzk <qu3nt1n@gmail.com> | 2024-02-27 22:15:59 +0100 |
commit | 64791f4b3d668b87de3f366daa287bf149e17de5 (patch) | |
tree | dc0739e4002d8290eaad756cbf42a7a3e43ceba7 | |
parent | dab5ed4d75e9af2f70db7cd7be914033f4edb583 (diff) |
FIX: too many open files. pdf opened by Poppler...new_from_file aren't closed properly.
-rw-r--r-- | development.md | 2 | ||||
-rw-r--r-- | src/modes/display/preview.rs | 15 |
2 files changed, 15 insertions, 2 deletions
diff --git a/development.md b/development.md index b676a82..7b7f3c4 100644 --- a/development.md +++ b/development.md @@ -934,6 +934,8 @@ New view: Tree ! Toggle with 't', fold with 'z'. Navigate normally. - [x] open temp file from bulk - [x] open multiple files - [ ] use the new mpsc event parser to read commands from stdin or RPC +- [x] FIX: too many open files. pdf opened by Poppler...new_from_file aren't closed properly. + Open manually and and use Poppler...new_from_data. ## TODO diff --git a/src/modes/display/preview.rs b/src/modes/display/preview.rs index 4332cc0..3634caa 100644 --- a/src/modes/display/preview.rs +++ b/src/modes/display/preview.rs @@ -899,8 +899,11 @@ impl Ueberzug { /// It may fail (and surelly crash the app) if the pdf is password protected. /// We pass a generic password which is hardcoded. fn make_pdf_thumbnail(pdf_path: &Path, index: usize) -> Result<usize> { + let mut data: Vec<u8> = std::fs::read(pdf_path)?; + // let doc: poppler::PopplerDocument = + // poppler::PopplerDocument::new_from_file(pdf_path, "upw")?; let doc: poppler::PopplerDocument = - poppler::PopplerDocument::new_from_file(pdf_path, "upw")?; + poppler::PopplerDocument::new_from_data(&mut data[..], "upw")?; let length = doc.get_n_pages(); if index >= length { return Err(anyhow!( @@ -917,8 +920,16 @@ impl Ueberzug { page.render(&ctx); ctx.restore()?; ctx.show_page()?; - let mut file = std::fs::File::create(THUMBNAIL_PATH)?; + let Ok(mut file) = std::fs::File::create(THUMBNAIL_PATH) else { + return Ok(0); + }; surface.write_to_png(&mut file)?; + surface.finish(); + // those drops should be useless + drop(doc); + drop(ctx); + drop(page); + drop(surface); Ok(length) } |