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 | |
parent | f0b32f45746c026d402651013b7e98315d6956a1 (diff) |
restructure and improve config
Diffstat (limited to '.config/awesome/quarrel')
-rw-r--r-- | .config/awesome/quarrel/bind.lua | 61 | ||||
-rw-r--r-- | .config/awesome/quarrel/fs.lua | 29 | ||||
-rw-r--r-- | .config/awesome/quarrel/init.lua | 17 | ||||
-rw-r--r-- | .config/awesome/quarrel/math.lua | 19 | ||||
-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 | ||||
-rw-r--r-- | .config/awesome/quarrel/table.lua | 59 | ||||
-rw-r--r-- | .config/awesome/quarrel/ui.lua | 52 | ||||
-rw-r--r-- | .config/awesome/quarrel/vars.lua | 91 |
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 |