about summary refs log tree commit diff
path: root/users/tazjin/gio-list-apps/src
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@tvl.su>2023-08-29T12·43+0300
committerclbot <clbot@tvl.fyi>2023-08-29T14·07+0000
commite5f7fe430d582c96b911b79dad03fad7c2d6aa9e (patch)
tree16528afb6d7aabedac82244ef8f3556ed23f13c9 /users/tazjin/gio-list-apps/src
parentd6bce3f83d2c1052c38ecba1445bbc10a9f03123 (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 '')
-rw-r--r--users/tazjin/gio-list-apps/src/lib.rs31
-rw-r--r--users/tazjin/gio-list-apps/src/main.rs20
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 0000000000..55eb8dc0be
--- /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 c6b6b98d4d..0000000000
--- 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,
-                    })
-                );
-            }
-        }
-    }
-}