diff options
author | delta <darkussdelta@gmail.com> | 2023-04-04 15:43:40 +0200 |
---|---|---|
committer | delta <darkussdelta@gmail.com> | 2023-04-04 15:43:40 +0200 |
commit | f7116d268aff3fae88d8de408e8c807295618a5c (patch) | |
tree | 6f52530d5799769e6af7c63bc5108f16f9aff742 /.config/awesome/quarrel/native | |
parent | f0b32f45746c026d402651013b7e98315d6956a1 (diff) |
restructure and improve config
Diffstat (limited to '.config/awesome/quarrel/native')
-rw-r--r-- | .config/awesome/quarrel/native/.gitignore | 2 | ||||
-rw-r--r-- | .config/awesome/quarrel/native/Cargo.toml | 20 | ||||
-rw-r--r-- | .config/awesome/quarrel/native/init.lua | 6 | ||||
-rw-r--r-- | .config/awesome/quarrel/native/install.log | 10 | ||||
l--------- | .config/awesome/quarrel/native/libqnative.so | 1 | ||||
-rw-r--r-- | .config/awesome/quarrel/native/rustfmt.toml | 3 | ||||
-rw-r--r-- | .config/awesome/quarrel/native/src/lenses/application.rs | 95 | ||||
-rw-r--r-- | .config/awesome/quarrel/native/src/lenses/calculator.rs | 36 | ||||
-rw-r--r-- | .config/awesome/quarrel/native/src/lenses/entry.rs | 19 | ||||
-rw-r--r-- | .config/awesome/quarrel/native/src/lenses/mod.rs | 3 | ||||
-rw-r--r-- | .config/awesome/quarrel/native/src/lib.rs | 15 |
11 files changed, 210 insertions, 0 deletions
diff --git a/.config/awesome/quarrel/native/.gitignore b/.config/awesome/quarrel/native/.gitignore new file mode 100644 index 0000000..4fffb2f --- /dev/null +++ b/.config/awesome/quarrel/native/.gitignore @@ -0,0 +1,2 @@ +/target +/Cargo.lock diff --git a/.config/awesome/quarrel/native/Cargo.toml b/.config/awesome/quarrel/native/Cargo.toml new file mode 100644 index 0000000..3806f3c --- /dev/null +++ b/.config/awesome/quarrel/native/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "qnative" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +freedesktop_entry_parser = "1.3.0" +# meval = "0.2.0" +cpc = "1.9.1" +mlua = { version = "0.8.7", features = [ "module", "lua54", "serialize" ] } +palette = { version = "0.6.1", default-features = false, features = [ "std" ] } +parking_lot = "0.12.1" +rayon = "1.6.1" +serde = { version = "1.0.152", features = [ "derive" ] } +url = "2.3.1" + +[lib] +crate-type = ["cdylib"] diff --git a/.config/awesome/quarrel/native/init.lua b/.config/awesome/quarrel/native/init.lua new file mode 100644 index 0000000..14c66e5 --- /dev/null +++ b/.config/awesome/quarrel/native/init.lua @@ -0,0 +1,6 @@ +local old_cpath = package.cpath +local cfg = require("gears.filesystem").get_configuration_dir() +package.cpath = package.cpath .. ";" .. cfg .. "quarrel/native/lib?.so" +local qnative = require "qnative" +package.cpath = old_cpath +return qnative diff --git a/.config/awesome/quarrel/native/install.log b/.config/awesome/quarrel/native/install.log new file mode 100644 index 0000000..c0f5d63 --- /dev/null +++ b/.config/awesome/quarrel/native/install.log @@ -0,0 +1,10 @@ +[03:45:24 2023-02-24] FETCHING Version 2.16.1 +[03:45:24 2023-02-24] CREATING /home/delta/.spicetify +[03:45:24 2023-02-24] DOWNLOADING https://github.com/spicetify/spicetify-cli/releases/download/v2.16.1/spicetify-2.16.1-linux-amd64.tar.gz +[03:45:34 2023-02-24] EXTRACTING /home/delta/.spicetify/spicetify.tar.gz +[03:45:34 2023-02-24] SETTING EXECUTABLE PERMISSIONS TO /home/delta/.spicetify/spicetify +[03:45:34 2023-02-24] REMOVING /home/delta/.spicetify/spicetify.tar.gz +[03:45:34 2023-02-24] APPENDING /home/delta/.spicetify to PATH in /home/delta/.config/fish/config.fish +[03:45:34 2023-02-24] Restart your shell to have spicetify in your PATH. +[03:45:34 2023-02-24] spicetify v2.16.1 was installed successfully to /home/delta/.spicetify +[03:45:34 2023-02-24] Run 'spicetify --help' to get started diff --git a/.config/awesome/quarrel/native/libqnative.so b/.config/awesome/quarrel/native/libqnative.so new file mode 120000 index 0000000..5fc821d --- /dev/null +++ b/.config/awesome/quarrel/native/libqnative.so @@ -0,0 +1 @@ +target/debug/libqnative.so
\ No newline at end of file diff --git a/.config/awesome/quarrel/native/rustfmt.toml b/.config/awesome/quarrel/native/rustfmt.toml new file mode 100644 index 0000000..36afbbd --- /dev/null +++ b/.config/awesome/quarrel/native/rustfmt.toml @@ -0,0 +1,3 @@ +imports_layout = "Vertical" +unstable_features = true +group_imports = "StdExternalCrate" diff --git a/.config/awesome/quarrel/native/src/lenses/application.rs b/.config/awesome/quarrel/native/src/lenses/application.rs new file mode 100644 index 0000000..4317c75 --- /dev/null +++ b/.config/awesome/quarrel/native/src/lenses/application.rs @@ -0,0 +1,95 @@ +use std::{ + fs::read_dir, + path::PathBuf, +}; + +use freedesktop_entry_parser as fd; +use mlua::prelude::*; +use parking_lot::Mutex; +use rayon::prelude::*; +use url::Url; + +use crate::lenses::entry::{ + entries_to_lua_table, + Entry, +}; + +fn parse_entry(entry: &fd::Entry, path: &PathBuf) -> Result<Entry, ()> { + let section = entry.section("Desktop Entry"); + let name = section.attr("Name").ok_or(())?.to_string(); + + if section.attr("Type").ok_or(())? != "Application" { + return Err(()); + } + + if section.attr("OnlyShowIn").is_some() + || section.attr("Hidden").is_some() + || section.attr("NoDisplay").is_some() + { + return Err(()); + } + + let exec = section.attr("Exec").ok_or(())?.to_string(); + let mut new_exec = exec.clone(); + for (index, _) in exec.match_indices('%') { + match exec.chars().nth(index + 1).unwrap().to_ascii_lowercase() { + 'i' => { + if let Some(icon) = section.attr("Icon") { + new_exec.replace_range(index..index + 2, &format!("--icon {icon}")); + } + } + 'c' => new_exec.replace_range(index..index + 2, &name), + 'k' => new_exec.replace_range(index..index + 2, Url::from_file_path(path)?.as_str()), + + 'f' | 'u' | 'v' | 'm' | 'd' | 'n' => new_exec.replace_range(index..index + 2, ""), + _ => continue, + } + } + + Ok(Entry { + message: name, + exec: Some(( + new_exec, + section + .attr("Terminal") + .unwrap_or("false") + .parse() + .map_err(drop)?, + )), + provider: "Application".to_string(), + }) +} + +pub fn query(lua: &Lua, input: String) -> LuaResult<LuaTable> { + let applications_dir = "/usr/share/applications"; + let entries = read_dir(applications_dir)? + .map(|result| result.map(|e| e.path())) + .collect::<Result<Vec<_>, std::io::Error>>()?; + + let entries = entries + .into_iter() + .filter(|e| matches!(e.extension(), Some(ext) if ext == "desktop")) + .collect::<Vec<_>>(); + + let mut parsed_entries: Mutex<Vec<Entry>> = Mutex::new(Vec::new()); + + entries.into_par_iter().for_each(|path| { + let Ok(entry) = fd::parse_entry(&path) else { + return + }; + + if let Ok(parsed_entry) = parse_entry(&entry, &path) { + parsed_entries.lock().push(parsed_entry); + } + }); + + Ok(entries_to_lua_table( + parsed_entries + .get_mut() + .iter() + .filter(|entry| entry.message.to_lowercase().contains(&input)) + .map(|entry| (*entry).clone()) + .collect(), + lua, + )) +} diff --git a/.config/awesome/quarrel/native/src/lenses/calculator.rs b/.config/awesome/quarrel/native/src/lenses/calculator.rs new file mode 100644 index 0000000..89b738e --- /dev/null +++ b/.config/awesome/quarrel/native/src/lenses/calculator.rs @@ -0,0 +1,36 @@ +// use meval::eval_str; +use cpc::{ + eval, + units::Unit, +}; +use mlua::prelude::*; + +use crate::lenses::entry::{ + entries_to_lua_table, + Entry, +}; + +pub fn query<'a>(lua: &Lua, input: String) -> LuaResult<LuaTable> { + let result = match eval(input.trim(), true, Unit::Celsius, false) { + Ok(result) => { + format!( + "{}{}", + result.value, + match result.unit { + Unit::NoUnit => "".to_owned(), + _ => format!(" {:?}", result.unit), + } + ) + } + Err(_) => return lua.create_table(), + }; + + Ok(entries_to_lua_table( + vec![Entry { + message: result, + exec: None, + provider: "Calculator".to_string(), + }], + lua, + )) +} diff --git a/.config/awesome/quarrel/native/src/lenses/entry.rs b/.config/awesome/quarrel/native/src/lenses/entry.rs new file mode 100644 index 0000000..c7ac09e --- /dev/null +++ b/.config/awesome/quarrel/native/src/lenses/entry.rs @@ -0,0 +1,19 @@ +use mlua::{ + prelude::*, + LuaSerdeExt, +}; +use serde::Serialize; + +#[derive(Serialize, Clone)] +pub struct Entry { + pub message: String, + pub exec: Option<(String, bool)>, + pub provider: String, +} + +pub fn entries_to_lua_table(entries: Vec<Entry>, lua: &Lua) -> LuaTable { + match lua.to_value(&entries).unwrap() { + LuaValue::Table(t) => t, + _ => unreachable!(), + } +} diff --git a/.config/awesome/quarrel/native/src/lenses/mod.rs b/.config/awesome/quarrel/native/src/lenses/mod.rs new file mode 100644 index 0000000..d0db6f7 --- /dev/null +++ b/.config/awesome/quarrel/native/src/lenses/mod.rs @@ -0,0 +1,3 @@ +pub mod application; +pub mod calculator; +pub mod entry; diff --git a/.config/awesome/quarrel/native/src/lib.rs b/.config/awesome/quarrel/native/src/lib.rs new file mode 100644 index 0000000..3a016c4 --- /dev/null +++ b/.config/awesome/quarrel/native/src/lib.rs @@ -0,0 +1,15 @@ +mod lenses; + +use mlua::prelude::*; + +#[mlua::lua_module] +fn qnative(lua: &Lua) -> LuaResult<LuaTable> { + let lenses = lua.create_table()?; + lenses.set("1", lua.create_function(lenses::calculator::query)?)?; + lenses.set("2", lua.create_function(lenses::application::query)?)?; + + let exports = lua.create_table()?; + exports.set("lenses", lenses)?; + + Ok(exports) +} |