aboutsummaryrefslogtreecommitdiff
path: root/.config/awesome/ui/fresnel/lenses
diff options
context:
space:
mode:
Diffstat (limited to '.config/awesome/ui/fresnel/lenses')
-rw-r--r--.config/awesome/ui/fresnel/lenses/.gitignore2
-rw-r--r--.config/awesome/ui/fresnel/lenses/Cargo.toml18
-rw-r--r--.config/awesome/ui/fresnel/lenses/install.log10
l---------.config/awesome/ui/fresnel/lenses/liblenses.so1
-rw-r--r--.config/awesome/ui/fresnel/lenses/rustfmt.toml3
-rw-r--r--.config/awesome/ui/fresnel/lenses/src/application.rs107
-rw-r--r--.config/awesome/ui/fresnel/lenses/src/calculator.rs25
-rw-r--r--.config/awesome/ui/fresnel/lenses/src/entry.rs20
-rw-r--r--.config/awesome/ui/fresnel/lenses/src/lib.rs16
9 files changed, 202 insertions, 0 deletions
diff --git a/.config/awesome/ui/fresnel/lenses/.gitignore b/.config/awesome/ui/fresnel/lenses/.gitignore
new file mode 100644
index 0000000..4fffb2f
--- /dev/null
+++ b/.config/awesome/ui/fresnel/lenses/.gitignore
@@ -0,0 +1,2 @@
+/target
+/Cargo.lock
diff --git a/.config/awesome/ui/fresnel/lenses/Cargo.toml b/.config/awesome/ui/fresnel/lenses/Cargo.toml
new file mode 100644
index 0000000..4dcb8bc
--- /dev/null
+++ b/.config/awesome/ui/fresnel/lenses/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "lenses"
+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"
+mlua = { version = "0.8.7", features = [ "module", "lua54", "serialize" ] }
+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/ui/fresnel/lenses/install.log b/.config/awesome/ui/fresnel/lenses/install.log
new file mode 100644
index 0000000..c0f5d63
--- /dev/null
+++ b/.config/awesome/ui/fresnel/lenses/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/ui/fresnel/lenses/liblenses.so b/.config/awesome/ui/fresnel/lenses/liblenses.so
new file mode 120000
index 0000000..5f7fc45
--- /dev/null
+++ b/.config/awesome/ui/fresnel/lenses/liblenses.so
@@ -0,0 +1 @@
+target/liblenses.so \ No newline at end of file
diff --git a/.config/awesome/ui/fresnel/lenses/rustfmt.toml b/.config/awesome/ui/fresnel/lenses/rustfmt.toml
new file mode 100644
index 0000000..36afbbd
--- /dev/null
+++ b/.config/awesome/ui/fresnel/lenses/rustfmt.toml
@@ -0,0 +1,3 @@
+imports_layout = "Vertical"
+unstable_features = true
+group_imports = "StdExternalCrate"
diff --git a/.config/awesome/ui/fresnel/lenses/src/application.rs b/.config/awesome/ui/fresnel/lenses/src/application.rs
new file mode 100644
index 0000000..0cf6c1a
--- /dev/null
+++ b/.config/awesome/ui/fresnel/lenses/src/application.rs
@@ -0,0 +1,107 @@
+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::entry::{
+ entries_to_lua_table,
+ Entry,
+};
+
+fn parse_entry<'a>(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(());
+ }
+
+ match section.attr("OnlyShowIn") {
+ Some(_) => return Err(()),
+ None => {}
+ }
+
+ match section.attr("Hidden") {
+ Some(_) => return Err(()),
+ None => {}
+ }
+
+ match section.attr("NoDisplay") {
+ Some(_) => return Err(()),
+ None => {}
+ }
+
+ 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' => match section.attr("Icon") {
+ Some(icon) => new_exec.replace_range(index..index + 2, &format!("--icon {}", icon)),
+ None => {}
+ },
+ '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| match e.extension() {
+ Some(ext) if ext == "desktop" => true,
+ None | _ => false,
+ })
+ .collect::<Vec<_>>();
+
+ let mut parsed_entries: Mutex<Vec<Entry>> = Mutex::new(Vec::new());
+
+ entries.into_par_iter().for_each(|path| {
+ let entry = match fd::parse_entry(&path) {
+ Ok(entry) => entry,
+ Err(_) => return,
+ };
+
+ match parse_entry(entry, path) {
+ Ok(parsed_entry) => parsed_entries.lock().push(parsed_entry),
+ Err(_) => return,
+ }
+ });
+
+ 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/ui/fresnel/lenses/src/calculator.rs b/.config/awesome/ui/fresnel/lenses/src/calculator.rs
new file mode 100644
index 0000000..792985d
--- /dev/null
+++ b/.config/awesome/ui/fresnel/lenses/src/calculator.rs
@@ -0,0 +1,25 @@
+use meval::eval_str;
+use mlua::prelude::*;
+
+use crate::entry::{
+ entries_to_lua_table,
+ Entry,
+};
+
+pub fn query(lua: &Lua, input: String) -> LuaResult<LuaTable> {
+ println!("{:?}", input);
+ let result = match eval_str(input.trim()) {
+ Ok(ok) => ok.to_string(),
+ Err(_) => return Ok(lua.create_table()?),
+ };
+
+ Ok(entries_to_lua_table(
+ vec![Entry {
+ message: result,
+ exec: None,
+ // icon: '',
+ provider: "Calculator".to_string(),
+ }],
+ lua,
+ ))
+}
diff --git a/.config/awesome/ui/fresnel/lenses/src/entry.rs b/.config/awesome/ui/fresnel/lenses/src/entry.rs
new file mode 100644
index 0000000..d6e7467
--- /dev/null
+++ b/.config/awesome/ui/fresnel/lenses/src/entry.rs
@@ -0,0 +1,20 @@
+use mlua::{
+ prelude::*,
+ LuaSerdeExt,
+};
+use serde::Serialize;
+
+#[derive(Serialize, Clone)]
+pub struct Entry {
+ pub message: String,
+ pub exec: Option<(String, bool)>,
+ // pub icon: char,
+ 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/ui/fresnel/lenses/src/lib.rs b/.config/awesome/ui/fresnel/lenses/src/lib.rs
new file mode 100644
index 0000000..e4fc881
--- /dev/null
+++ b/.config/awesome/ui/fresnel/lenses/src/lib.rs
@@ -0,0 +1,16 @@
+mod application;
+mod calculator;
+mod entry;
+
+use mlua::prelude::*;
+
+#[mlua::lua_module]
+fn lenses(lua: &Lua) -> LuaResult<LuaTable> {
+ let exports = lua.create_table()?;
+ // lua.create_fun
+ // exports.push(application::query)?;
+ exports.set("1", lua.create_function(calculator::query)?)?;
+ exports.set("2", lua.create_function(application::query)?)?;
+
+ Ok(exports)
+}