aboutsummaryrefslogtreecommitdiff
path: root/.config/awesome/quarrel
diff options
context:
space:
mode:
authordelta <darkussdelta@gmail.com>2023-04-04 15:43:40 +0200
committerdelta <darkussdelta@gmail.com>2023-04-04 15:43:40 +0200
commitf7116d268aff3fae88d8de408e8c807295618a5c (patch)
tree6f52530d5799769e6af7c63bc5108f16f9aff742 /.config/awesome/quarrel
parentf0b32f45746c026d402651013b7e98315d6956a1 (diff)
restructure and improve config
Diffstat (limited to '.config/awesome/quarrel')
-rw-r--r--.config/awesome/quarrel/bind.lua61
-rw-r--r--.config/awesome/quarrel/fs.lua29
-rw-r--r--.config/awesome/quarrel/init.lua17
-rw-r--r--.config/awesome/quarrel/math.lua19
-rw-r--r--.config/awesome/quarrel/native/.gitignore2
-rw-r--r--.config/awesome/quarrel/native/Cargo.toml20
-rw-r--r--.config/awesome/quarrel/native/init.lua6
-rw-r--r--.config/awesome/quarrel/native/install.log10
l---------.config/awesome/quarrel/native/libqnative.so1
-rw-r--r--.config/awesome/quarrel/native/rustfmt.toml3
-rw-r--r--.config/awesome/quarrel/native/src/lenses/application.rs95
-rw-r--r--.config/awesome/quarrel/native/src/lenses/calculator.rs36
-rw-r--r--.config/awesome/quarrel/native/src/lenses/entry.rs19
-rw-r--r--.config/awesome/quarrel/native/src/lenses/mod.rs3
-rw-r--r--.config/awesome/quarrel/native/src/lib.rs15
-rw-r--r--.config/awesome/quarrel/table.lua59
-rw-r--r--.config/awesome/quarrel/ui.lua52
-rw-r--r--.config/awesome/quarrel/vars.lua91
18 files changed, 538 insertions, 0 deletions
diff --git a/.config/awesome/quarrel/bind.lua b/.config/awesome/quarrel/bind.lua
new file mode 100644
index 0000000..327da0b
--- /dev/null
+++ b/.config/awesome/quarrel/bind.lua
@@ -0,0 +1,61 @@
+local awful = require "awful"
+local gtable = require "gears.table"
+local insightful = require "ui.insightful"
+
+local qbind = {}
+
+local function get_binding_function(trigger)
+ if type(trigger) == "number" and trigger <= 5 and trigger > 0 then
+ return "button"
+ elseif type(trigger) == "string" then
+ return "key"
+ end
+ error("trigger can only be a mouse button or a key", 2)
+end
+
+local function translate_binding(binding, trigger, multiple)
+ local value = nil
+ if multiple then
+ value = trigger[2]
+ trigger = trigger[1]
+ end
+
+ local awful_binding = {
+ modifiers = binding.mods,
+ [get_binding_function(trigger)] = trigger,
+ on_press = multiple and function(...) binding.press(value, ...) end or binding.press
+ }
+
+ if binding.desc then
+ awful_binding.description = binding.desc
+ end
+ if binding.group then
+ awful_binding.group = binding.group
+ end
+
+ return awful[get_binding_function(trigger)](awful_binding)
+end
+
+function qbind:new(binding)
+ if not binding.hidden then table.insert(insightful._bindings, binding) end
+ binding.mods = binding.mods or {}
+
+ local awful_bindings = {}
+
+ if type(binding.triggers) == "table" then
+ for _, trigger in ipairs(binding.triggers) do
+ table.insert(awful_bindings, translate_binding(binding, trigger, true))
+ end
+ elseif type(binding.triggers) == "string" or type(binding.triggers) == "number" then
+ return translate_binding(binding, binding.triggers, false)
+ else
+ error("binding.triggers can only be a string or a table")
+ end
+
+ -- for some reason multi-trigger bindings only work if i do this
+ -- i spent a day debugging this
+ -- thanks awesome
+ return gtable.join(table.unpack(awful_bindings))
+end
+
+return qbind
diff --git a/.config/awesome/quarrel/fs.lua b/.config/awesome/quarrel/fs.lua
new file mode 100644
index 0000000..89a1bc6
--- /dev/null
+++ b/.config/awesome/quarrel/fs.lua
@@ -0,0 +1,29 @@
+local GFile = require "lgi".Gio.File
+
+local qfs = {}
+
+function qfs.read(path, format)
+ local f = assert(io.open(path, "r"))
+ local c = f:read(format or "a")
+ f:close()
+ return c
+end
+
+function qfs.ls_files(path, absolute)
+ local files = GFile.new_for_path(path):enumerate_children("standard::*", 0)
+ local files_filtered = {}
+
+ if not files then return {} end
+
+ for file in function() return files:next_file() end do
+ if file:get_file_type() == "REGULAR" then
+ local file_name = file:get_display_name()
+ file_name = absolute and (path:gsub("[/]*$", "") .. "/" .. file_name) or file_name
+ table.insert(files_filtered, file_name)
+ end
+ end
+
+ return files_filtered
+end
+
+return qfs
diff --git a/.config/awesome/quarrel/init.lua b/.config/awesome/quarrel/init.lua
new file mode 100644
index 0000000..025d899
--- /dev/null
+++ b/.config/awesome/quarrel/init.lua
@@ -0,0 +1,17 @@
+local n = require "naughty".notification
+
+local quarrel = {}
+
+function quarrel.debug(message)
+ n { message = tostring(message) }
+end
+
+function quarrel.is_restart()
+ awesome.register_xproperty("is_restart", "boolean")
+ local restart_detected = awesome.get_xproperty("is_restart") ~= nil
+ awesome.set_xproperty("is_restart", true)
+
+ return restart_detected
+ end
+
+return quarrel
diff --git a/.config/awesome/quarrel/math.lua b/.config/awesome/quarrel/math.lua
new file mode 100644
index 0000000..bc1f53b
--- /dev/null
+++ b/.config/awesome/quarrel/math.lua
@@ -0,0 +1,19 @@
+local qmath = {}
+
+function qmath.step_value(value, steps)
+ for i, step in ipairs(steps) do
+ if step[1] <= value and value <= steps[i + 1][1] then
+ return step[2]
+ end
+ end
+end
+
+function qmath.translate_range(value, in_min, in_max, out_min, out_max)
+ return out_min + ((out_max - out_min) / (in_max - in_min)) * (value - in_min)
+end
+
+function qmath.clamp(value, min, max)
+ return math.max(math.min(value, max), min)
+end
+
+return qmath
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)
+}
diff --git a/.config/awesome/quarrel/table.lua b/.config/awesome/quarrel/table.lua
new file mode 100644
index 0000000..13ccbce
--- /dev/null
+++ b/.config/awesome/quarrel/table.lua
@@ -0,0 +1,59 @@
+local qtable = {}
+
+function qtable.map(t, f)
+ local nt = {}
+ for k,v in pairs(t) do
+ nt[k] = f(v)
+ end
+ return nt
+end
+
+function qtable.filter(t, f, dict)
+ local nt = {}
+ for k,v in pairs(t) do
+ if not f(v) then goto continue end
+ if dict then
+ nt[k] = v
+ else
+ table.insert(nt, v)
+ end
+ ::continue::
+ end
+ return nt
+end
+
+-- This is taken from http://lua-users.org/wiki/SortedIteration
+-- This version is stripped of comments and empty lines + some stuff is renamed
+
+local function __gen_oindex(t)
+ local oindex = {}
+ for key in pairs(t) do
+ table.insert(oindex, key)
+ end
+ table.sort(oindex)
+ return oindex
+end
+
+function qtable.onext(t, state)
+ local key = nil
+ if state == nil then
+ t.__oindex = __gen_oindex(t)
+ key = t.__oindex[1]
+ else
+ for i = 1,#t.__oindex do
+ if t.__oindex[i] == state then
+ key = t.__oindex[i+1]
+ end
+ end
+ end
+ if key then
+ return key, t[key]
+ end
+ t.__oindex = nil
+end
+
+function qtable.opairs(t)
+ return qtable.onext, t, nil
+end
+
+return qtable
diff --git a/.config/awesome/quarrel/ui.lua b/.config/awesome/quarrel/ui.lua
new file mode 100644
index 0000000..8e979cb
--- /dev/null
+++ b/.config/awesome/quarrel/ui.lua
@@ -0,0 +1,52 @@
+local awful = require "awful"
+local gears = require "gears"
+local qvars = require "quarrel.vars"
+local wibox = require "wibox"
+
+local qui = {}
+
+function qui.markup_fg(color, text)
+ return "<span color=\"" .. color .. "\">" .. text .. "</span>"
+end
+
+function qui.markup_bg(color, text)
+ return "<span bgcolor=\"" .. color .. "\">" .. text .. "</span>"
+end
+
+function qui.font(factor)
+ return qvars.text_font .. " " .. qvars.font_size * (factor or 1)
+end
+
+function qui.symbol_font(factor)
+ return qvars.symbol_font .. " " .. qvars.font_size * (factor or 1)
+end
+
+function qui.styled(target)
+ return gears.table.crush({
+ bg = qvars.colors.bg,
+ border_color = qvars.colors.bright.black,
+ border_width = qvars.border_width,
+ shape = qvars.shape
+ }, target)
+end
+
+function qui.popup(args)
+ args.widget = {
+ widget = wibox.container.margin,
+ margins = qvars.big_padding,
+ args.widget
+ }
+
+ return awful.popup(qui.styled(args))
+end
+
+function qui.tooltip(objects, callback)
+ awful.tooltip(qui.styled {
+ objects = objects,
+ timer_function = callback,
+ margin_leftright = qvars.padding,
+ margin_topbottom = qvars.padding
+ })
+end
+
+return qui
diff --git a/.config/awesome/quarrel/vars.lua b/.config/awesome/quarrel/vars.lua
new file mode 100644
index 0000000..cbc7f00
--- /dev/null
+++ b/.config/awesome/quarrel/vars.lua
@@ -0,0 +1,91 @@
+local btns = require "awful".button.names
+local gears = require "gears"
+local xresources = require "beautiful.xresources"
+local x_col = xresources.get_current_theme()
+local dpi = xresources.apply_dpi
+local wibox = require "wibox"
+
+local qvars = {}
+
+qvars.anim_duration = 0.15
+qvars.anim_intro = qvars.anim_duration / 4
+
+qvars.notif_timeout = 3 + qvars.anim_duration * 2
+
+function qvars.shape(cr,w,h)
+ gears.shape.rounded_rect(cr,w,h,dpi(4))
+end
+
+qvars.border_width = dpi(1.5)
+
+qvars.padding = dpi(4)
+qvars.big_padding = dpi(8)
+
+qvars.text_font = "Fira Code Nerd Font Mono Medium"
+qvars.symbol_font = "Symbols Nerd Font:style=1000-em"
+qvars.font_size = 8
+qvars.font = qvars.text_font .. " " .. qvars.font_size
+
+local char_width, char_height = wibox.widget {
+ widget = wibox.widget.textbox,
+ text = "a"
+}:get_preferred_size_at_dpi(screen[1].dpi)
+
+qvars.char_height = char_height
+qvars.char_width = char_width
+
+-- qvars.bar_size = dpi(16)
+qvars.bar_size = dpi(24) + qvars.big_padding * 2
+qvars.icon_size = qvars.char_height
+qvars.button_size = dpi(12)
+
+qvars.colors = {
+ fg = x_col.foreground,
+ bg = x_col.background,
+
+ black = x_col.color0,
+ red = x_col.color1,
+ green = x_col.color2,
+ yellow = x_col.color3,
+ blue = x_col.color4,
+ pink = x_col.color5,
+ cyan = x_col.color6,
+ white = x_col.color7,
+
+ bright = {
+ black = x_col.color8,
+ red = x_col.color9,
+ green = x_col.color10,
+ yellow = x_col.color11,
+ blue = x_col.color12,
+ pink = x_col.color13,
+ cyan = x_col.color14,
+ white = x_col.color15,
+ },
+
+ dim = {
+ fg = "#8893a5",
+ bg = "#20262e"
+ }
+}
+
+-- taken from https://github.com/bew/dotfiles/blob/ab9bb1935783f7a31ef777b1d7e26d53f35df864/gui/wezterm/cfg_utils.lua
+qvars.mods = setmetatable({ _SHORT_MAP = { C = "Control", S = "Shift", A = "Mod1", M = "Mod4" } }, {
+ __index = function(self, key)
+ local resolved_mods = {}
+ for i = 1, #key do
+ resolved_mods[i] = self._SHORT_MAP[key:sub(i, i)]
+ end
+ return resolved_mods
+ end
+})
+
+qvars.btns = {
+ left = btns.LEFT,
+ right = btns.RIGHT,
+ middle = btns.MIDDLE,
+ up = btns.SCROLL_UP,
+ down = btns.SCROLL_DOWN
+}
+
+return qvars