diff options
author | Vincent Ambo <tazjin@tvl.su> | 2023-08-29T12·43+0300 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2023-08-29T14·07+0000 |
commit | e5f7fe430d582c96b911b79dad03fad7c2d6aa9e (patch) | |
tree | 16528afb6d7aabedac82244ef8f3556ed23f13c9 /users/tazjin/gio-list-apps/src/lib.rs | |
parent | d6bce3f83d2c1052c38ecba1445bbc10a9f03123 (diff) |
refactor(tazjin/gio-list-apps): refactor into dynamic Emacs module r/6534
Instead of producing a binary that gets called by Emacs, with input/output serialisation, use a dynamic Emacs module that lets Emacs more-or-less directly call the relevant GTK functions. I'm doing this mostly as an experiment. Might be interesting to end up with a dynamic module that I can dump some experimental code into that improves my workflows. To do this, I've exposed the emacs binary used by my Emacs configuration in an additional `passthru` field. This ensures that the module is linked against the right version of Emacs. Change-Id: I1426994fe3455ed1b2a685c5a09705e29fa40950 Reviewed-on: https://cl.tvl.fyi/c/depot/+/9163 Tested-by: BuildkiteCI Reviewed-by: tazjin <tazjin@tvl.su> Autosubmit: tazjin <tazjin@tvl.su>
Diffstat (limited to 'users/tazjin/gio-list-apps/src/lib.rs')
-rw-r--r-- | users/tazjin/gio-list-apps/src/lib.rs | 31 |
1 files changed, 31 insertions, 0 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) +} |