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 | |
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')
-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, - }) - ); - } - } - } -} |