diff options
Diffstat (limited to 'users/tazjin/gio-list-apps/src')
-rw-r--r-- | users/tazjin/gio-list-apps/src/lib.rs | 31 | ||||
-rw-r--r-- | users/tazjin/gio-list-apps/src/main.rs | 20 |
2 files changed, 31 insertions, 20 deletions
diff --git a/users/tazjin/gio-list-apps/src/lib.rs b/users/tazjin/gio-list-apps/src/lib.rs new file mode 100644 index 000000000000..55eb8dc0be20 --- /dev/null +++ b/users/tazjin/gio-list-apps/src/lib.rs @@ -0,0 +1,31 @@ +use emacs::{defun, Env, IntoLisp, Result, Value}; +use gio::traits::AppInfoExt; +use gio::AppInfo; + +emacs::plugin_is_GPL_compatible!(); + +#[emacs::module(defun_prefix = "taz", mod_in_name = false)] +fn init(_: &Env) -> Result<()> { + Ok(()) +} + +/// Returns an alist of the currently available XDG applications (through their +/// `.desktop' shortcuts), and the command line parameters needed to start them. +/// +/// Hidden applications or applications without specified command-line +/// parameters are not included. +#[defun] +fn list_xdg_apps(env: &Env) -> Result<Value> { + let mut visible_apps: Vec<Value> = vec![]; + + for app in AppInfo::all().into_iter().filter(AppInfo::should_show) { + if let Some(cmd) = app + .commandline() + .and_then(|p| Some(p.to_str()?.to_string())) + { + visible_apps.push(env.cons(app.name().as_str().into_lisp(env)?, cmd.into_lisp(env)?)?); + } + } + + env.list(&visible_apps) +} diff --git a/users/tazjin/gio-list-apps/src/main.rs b/users/tazjin/gio-list-apps/src/main.rs deleted file mode 100644 index c6b6b98d4d9c..000000000000 --- a/users/tazjin/gio-list-apps/src/main.rs +++ /dev/null @@ -1,20 +0,0 @@ -use gio::traits::AppInfoExt; -use gio::AppInfo; -use serde_json::json; - -fn main() { - for app in AppInfo::all() { - if app.should_show() { - if let Some(cmd) = app.commandline() { - println!( - "{}", - json!({ - "name": app.name().as_str(), - "display_name": app.display_name().as_str(), - "commandline": cmd, - }) - ); - } - } - } -} |