From ade8dc1950f1b6498c40a86e0ca1c6a47e8d5e51 Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy Date: Sun, 27 Mar 2022 20:10:39 +0200 Subject: [PATCH] feat(recent): Get recently-used files without GTK dependency --- Cargo.lock | 419 +++----------------------------------- Cargo.toml | 2 +- debian/control | 1 - plugins/Cargo.toml | 2 +- plugins/src/recent/mod.rs | 62 +++--- 5 files changed, 68 insertions(+), 418 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8996e7d..2e4c4eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -137,30 +137,6 @@ dependencies = [ "syn", ] -[[package]] -name = "atk" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" -dependencies = [ - "atk-sys", - "bitflags", - "glib", - "libc", -] - -[[package]] -name = "atk-sys" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -215,45 +191,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" -[[package]] -name = "cairo-rs" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "129e928d3eda625f53ce257589efbe5143416875fd01bddd08c8c6feb8b9962b" -dependencies = [ - "bitflags", - "cairo-sys-rs", - "glib", - "libc", - "thiserror", -] - -[[package]] -name = "cairo-sys-rs" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - [[package]] name = "cc" version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" -[[package]] -name = "cfg-expr" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e068cb2806bbc15b439846dc16c5f89f8599f2c3e4d73d4449d38f9b2f0b6c5" -dependencies = [ - "smallvec", -] - [[package]] name = "cfg-if" version = "1.0.0" @@ -431,16 +374,6 @@ dependencies = [ "instant", ] -[[package]] -name = "field-offset" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" -dependencies = [ - "memoffset", - "rustc_version", -] - [[package]] name = "flume" version = "0.10.12" @@ -632,65 +565,6 @@ dependencies = [ "pin-project 0.4.29", ] -[[package]] -name = "gdk" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" -dependencies = [ - "bitflags", - "cairo-rs", - "gdk-pixbuf", - "gdk-sys", - "gio", - "glib", - "libc", - "pango", -] - -[[package]] -name = "gdk-pixbuf" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678516f1baef591d270ca10587c01a12542a731a7879cc62391a18191a470831" -dependencies = [ - "bitflags", - "gdk-pixbuf-sys", - "gio", - "glib", - "libc", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gdk-sys" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "pkg-config", - "system-deps", -] - [[package]] name = "gen-z" version = "0.1.0" @@ -733,147 +607,6 @@ dependencies = [ "temp-dir", ] -[[package]] -name = "gio" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cd21a7a674ea811749661012512b0ba5237ba404ccbcab2850db5537549b64" -dependencies = [ - "bitflags", - "futures-channel", - "futures-core", - "futures-io", - "gio-sys", - "glib", - "libc", - "once_cell", - "thiserror", -] - -[[package]] -name = "gio-sys" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", - "winapi", -] - -[[package]] -name = "glib" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a826fad715b57834920839d7a594c3b5e416358c7d790bdaba847a40d7c1d96d" -dependencies = [ - "bitflags", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "glib-macros", - "glib-sys", - "gobject-sys", - "libc", - "once_cell", - "smallvec", - "thiserror", -] - -[[package]] -name = "glib-macros" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac4d47c544af67747652ab1865ace0ffa1155709723ac4f32e97587dd4735b2" -dependencies = [ - "anyhow", - "heck", - "proc-macro-crate", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "glib-sys" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" -dependencies = [ - "libc", - "system-deps", -] - -[[package]] -name = "gobject-sys" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gtk" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f2d1326b36af927fe46ae2f89a8fec38c6f0d279ebc5ef07ffeeabb70300bfc" -dependencies = [ - "atk", - "bitflags", - "cairo-rs", - "field-offset", - "futures-channel", - "gdk", - "gdk-pixbuf", - "gio", - "glib", - "gtk-sys", - "gtk3-macros", - "libc", - "once_cell", - "pango", - "pkg-config", -] - -[[package]] -name = "gtk-sys" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" -dependencies = [ - "atk-sys", - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "system-deps", -] - -[[package]] -name = "gtk3-macros" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24f518afe90c23fba585b2d7697856f9e6a7bbc62f65588035e66f6afb01a2e9" -dependencies = [ - "anyhow", - "proc-macro-crate", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "h2" version = "0.3.12" @@ -899,12 +632,6 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -[[package]] -name = "heck" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" - [[package]] name = "hermit-abi" version = "0.1.19" @@ -1182,9 +909,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +checksum = "09bf6f32a3afefd0b587ee42ed19acd945c6d1f3b5424040f50b2f24ab16be77" dependencies = [ "lazy_static", "libc", @@ -1324,31 +1051,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "pango" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" -dependencies = [ - "bitflags", - "glib", - "libc", - "once_cell", - "pango-sys", -] - -[[package]] -name = "pango-sys" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - [[package]] name = "parking" version = "2.0.0" @@ -1361,15 +1063,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" -[[package]] -name = "pest" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" -dependencies = [ - "ucd-trie", -] - [[package]] name = "pin-project" version = "0.4.29" @@ -1478,11 +1171,11 @@ dependencies = [ "fork", "freedesktop-desktop-entry", "futures", - "gtk", "human-sort", "human_format", "new_mime_guess", "pop-launcher", + "recently-used-xbel", "regex", "reqwest", "ron", @@ -1544,30 +1237,6 @@ dependencies = [ "toml", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro2" version = "1.0.36" @@ -1616,6 +1285,18 @@ dependencies = [ "getrandom", ] +[[package]] +name = "recently-used-xbel" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9533c371523034735c8c68da31004561dd011df9d45d0e5886c141858a7d17" +dependencies = [ + "dirs 4.0.0", + "serde", + "serde-xml-rs", + "thiserror", +] + [[package]] name = "redox_syscall" version = "0.2.12" @@ -1718,15 +1399,6 @@ dependencies = [ "serde", ] -[[package]] -name = "rustc_version" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver", -] - [[package]] name = "rustversion" version = "1.0.6" @@ -1778,24 +1450,6 @@ dependencies = [ "libc", ] -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - [[package]] name = "serde" version = "1.0.136" @@ -1805,6 +1459,18 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-xml-rs" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65162e9059be2f6a3421ebbb4fef3e74b7d9e7c60c50a0e292c6239f19f1edfa" +dependencies = [ + "log", + "serde", + "thiserror", + "xml-rs", +] + [[package]] name = "serde_derive" version = "1.0.136" @@ -1969,19 +1635,6 @@ dependencies = [ "numtoa", ] -[[package]] -name = "system-deps" -version = "6.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a45a1c4c9015217e12347f2a411b57ce2c4fc543913b14b6fe40483328e709" -dependencies = [ - "cfg-expr", - "heck", - "pkg-config", - "toml", - "version-compare", -] - [[package]] name = "temp-dir" version = "0.1.11" @@ -2193,12 +1846,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" -[[package]] -name = "ucd-trie" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" - [[package]] name = "unicase" version = "2.6.0" @@ -2259,12 +1906,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "version-compare" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73" - [[package]] name = "version_check" version = "0.9.4" @@ -2430,6 +2071,12 @@ dependencies = [ "dirs 4.0.0", ] +[[package]] +name = "xml-rs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" + [[package]] name = "zbus" version = "2.1.1" diff --git a/Cargo.toml b/Cargo.toml index e8ce2d7..1e3a2d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,4 +24,4 @@ features = ["io-std", "io-util"] [dependencies.tokio-stream] version = "0.1.8" -features = ["io-util"] \ No newline at end of file +features = ["io-util"] diff --git a/debian/control b/debian/control index f6363e9..53dc005 100644 --- a/debian/control +++ b/debian/control @@ -6,7 +6,6 @@ Build-Depends: cargo, debhelper-compat (=10), just, - libgtk-3-dev, libssl-dev, rustc (>=1.47), Standards-Version: 4.1.1 diff --git a/plugins/Cargo.toml b/plugins/Cargo.toml index e78e446..873edad 100644 --- a/plugins/Cargo.toml +++ b/plugins/Cargo.toml @@ -10,7 +10,6 @@ publish = false async-pidfd = "0.1.4" fork = "0.1.19" freedesktop-desktop-entry = "0.5.0" -gtk = "0.15.4" human_format = "1.0.3" human-sort = "0.2.2" new_mime_guess = "4.0.1" @@ -35,6 +34,7 @@ dirs = "4.0.0" futures = "0.3.21" reqwest = "0.11.10" bytes = "1.1.0" +recently-used-xbel = "1.0.0" [dependencies.tokio] version = "1.17.0" diff --git a/plugins/src/recent/mod.rs b/plugins/src/recent/mod.rs index 968de7d..07eb90c 100644 --- a/plugins/src/recent/mod.rs +++ b/plugins/src/recent/mod.rs @@ -2,13 +2,13 @@ // Copyright © 2021 System76 use futures::prelude::*; -use gtk::prelude::*; use pop_launcher::*; +use recently_used_xbel::{parse_file, RecentlyUsed}; use slab::Slab; use std::borrow::Cow; pub struct App { - manager: gtk::RecentManager, + recent: Option, out: tokio::io::Stdout, uris: Slab, } @@ -16,7 +16,7 @@ pub struct App { impl Default for App { fn default() -> Self { Self { - manager: gtk::RecentManager::new(), + recent: None, out: async_stdout(), uris: Slab::new(), } @@ -24,15 +24,17 @@ impl Default for App { } pub async fn main() { - if gtk::init().is_err() { - tracing::error!("failed to initialize GTK"); - return; - } - let mut requests = json_input_stream(async_stdin()); let mut app = App::default(); + match parse_file() { + Ok(recent) => app.recent = Some(recent), + Err(why) => { + tracing::error!("failed to parse recently used files: {}", why); + } + } + while let Some(result) = requests.next().await { match result { Ok(request) => match request { @@ -58,27 +60,29 @@ impl App { async fn search(&mut self, query: String) { self.uris.clear(); - if let Some(query) = normalized(&query) { - for item in self.manager.items() { - if let Some(name) = item.display_name() { - if name.to_ascii_lowercase().contains(&query) { - if let Some((mime, uri)) = item.mime_type().zip(item.uri()) { - let id = self.uris.insert(uri.to_string()); - crate::send( - &mut self.out, - PluginResponse::Append(PluginSearchResult { - id: id as u32, - name: name.to_string(), - description: item - .uri_display() - .map(String::from) - .unwrap_or_default(), - icon: Some(IconSource::Mime(Cow::Owned(mime.to_string()))), - ..Default::default() - }), - ) - .await; - } + if let Some((recent, query)) = self.recent.as_ref().zip(normalized(&query)) { + for item in recent.bookmarks.iter() { + let display_uri = item.href.replace("%20", " "); + + let name = match display_uri.rfind('/') { + Some(pos) => &display_uri[pos + 1..], + None => &display_uri, + }; + + if name.to_ascii_lowercase().contains(&query) { + if let Some(mime) = new_mime_guess::from_path(&item.href).first() { + let id = self.uris.insert(item.href.clone()); + crate::send( + &mut self.out, + PluginResponse::Append(PluginSearchResult { + id: id as u32, + name: name.to_owned(), + description: display_uri, + icon: Some(IconSource::Mime(Cow::Owned(mime.to_string()))), + ..Default::default() + }), + ) + .await; } } }