refactor(tazjin/gio-list-apps): refactor into dynamic Emacs module

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>
This commit is contained in:
Vincent Ambo 2023-08-29 15:43:13 +03:00 committed by clbot
parent d6bce3f83d
commit e5f7fe430d
7 changed files with 178 additions and 52 deletions

View file

@ -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)
}

View file

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