diff --git a/.Xresources b/.Xresources new file mode 100644 index 0000000..c71bd71 --- /dev/null +++ b/.Xresources @@ -0,0 +1,42 @@ +Xft.dpi: 120 +Xft.rgba: rgb +Xcursor.theme: phinger-cursors + +! special +*.foreground: #dfe2e7 +*.background: #222831 +*.cursorColor: #dfe2e7 + +! black +*.color0: #252c36 +*.color8: #36404f +!*.color8: #2c3440 + +! red +*.color1: #de615c +*.color9: #e8908d + +! green +*.color2: #91d89a +*.color10: #b2e4b8 + +! yellow +*.color3: #ffc469 +*.color11: #ffd696 + +! blue +*.color4: #8fc7ff +*.color12: #b1d8ff + +! magenta +*.color5: #f2b9c1 +*.color13: #f6ced4 + +! cyan +*.color6: #9cfdff +*.color14: #bafeff + +! white +*.color7: #dfe2e7 +*.color15: #e9ebee + diff --git a/.config/awesome/assets/phosphor/battery-charging-vertical-fill.svg b/.config/awesome/assets/phosphor/battery-vertical-charging-fill.svg similarity index 100% rename from .config/awesome/assets/phosphor/battery-charging-vertical-fill.svg rename to .config/awesome/assets/phosphor/battery-vertical-charging-fill.svg diff --git a/.config/awesome/assets/phosphor/battery-warning-vertical-fill.svg b/.config/awesome/assets/phosphor/battery-vertical-warning-fill.svg similarity index 100% rename from .config/awesome/assets/phosphor/battery-warning-vertical-fill.svg rename to .config/awesome/assets/phosphor/battery-vertical-warning-fill.svg diff --git a/.config/awesome/assets/phosphor/speaker-simple-slash-fill.svg b/.config/awesome/assets/phosphor/speaker-simple-slash-fill.svg new file mode 100644 index 0000000..fdcfd5d --- /dev/null +++ b/.config/awesome/assets/phosphor/speaker-simple-slash-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.config/awesome/misc/keys.lua b/.config/awesome/misc/keys.lua index bc5fdb6..432f3eb 100644 --- a/.config/awesome/misc/keys.lua +++ b/.config/awesome/misc/keys.lua @@ -1,13 +1,12 @@ -local archaic = require "ui.archaic" local awful = require "awful" local cfg = require "misc.cfg" -local flashy = require "ui.flashy" local fresnel = require "ui.fresnel" local gtimer = require "gears.timer" local insightful = require "ui.insightful" local naughty = require "naughty" local qbind = require "quarrel.bind" local qvars = require "quarrel.vars" +local playerctl = require "services.playerctl" local recording = { false, "" } @@ -15,7 +14,7 @@ client.connect_signal("request::default_mousebindings", function() awful.mouse.append_client_mousebindings { qbind:new { triggers = qvars.btns.left, - press = function (c) + press = function(c) c:activate { context = "mouse_click" } @@ -26,7 +25,7 @@ client.connect_signal("request::default_mousebindings", function() qbind:new { mods = qvars.mods.M, triggers = qvars.btns.left, - press = function (c) + press = function(c) c:activate { context = "mouse_click", action = "mouse_move" @@ -38,7 +37,7 @@ client.connect_signal("request::default_mousebindings", function() qbind:new { mods = qvars.mods.M, triggers = qvars.btns.right, - press = function (c) + press = function(c) c:activate { context = "mouse_click", action = "mouse_resize" @@ -110,19 +109,6 @@ awful.keyboard.append_global_keybindings { group = "awesome", desc = "toggle insightful" }, - qbind:new { - mods = qvars.mods.MC, - triggers = "a", - press = function() - if flashy._widget.visible then - flashy:hide() - else - flashy:show() - end - end, - group = "awesome", - desc = "toggle flashy" - }, qbind:new { mods = qvars.mods.M, triggers = "space", @@ -132,15 +118,6 @@ awful.keyboard.append_global_keybindings { group = "awesome", desc = "toggle fresnel" }, - qbind:new { - mods = qvars.mods.MC, - triggers = "d", - press = function() - archaic:toggle() - end, - group = "awesome", - desc = "toggle archaic" - }, qbind:new { mods = {}, @@ -175,9 +152,9 @@ awful.keyboard.append_global_keybindings { }, press = function(next) if next then - archaic.playerctl:next() + playerctl:next() else - archaic.playerctl:previous() + playerctl:previous() end end, group = "audio", @@ -187,7 +164,7 @@ awful.keyboard.append_global_keybindings { mods = {}, triggers = "XF86AudioPlay", press = function() - archaic.playerctl:play_pause() + playerctl:play_pause() end, group = "audio", desc = "(un)pause song" diff --git a/.config/awesome/misc/rules.lua b/.config/awesome/misc/rules.lua index 005b248..b4d1dfa 100644 --- a/.config/awesome/misc/rules.lua +++ b/.config/awesome/misc/rules.lua @@ -90,7 +90,7 @@ ruled.client.connect_signal("request::rules", function() ruled.client.append_rule({ id = "steam", rule_any = { - class = { "Steam" } + class = { "steam" } }, properties = { screen = 1, diff --git a/.config/awesome/quarrel/json.lua b/.config/awesome/quarrel/json.lua new file mode 100644 index 0000000..711ef78 --- /dev/null +++ b/.config/awesome/quarrel/json.lua @@ -0,0 +1,388 @@ +-- +-- json.lua +-- +-- Copyright (c) 2020 rxi +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of +-- this software and associated documentation files (the "Software"), to deal in +-- the Software without restriction, including without limitation the rights to +-- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +-- of the Software, and to permit persons to whom the Software is furnished to do +-- so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all +-- copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +-- SOFTWARE. +-- + +local json = { _version = "0.1.2" } + +------------------------------------------------------------------------------- +-- Encode +------------------------------------------------------------------------------- + +local encode + +local escape_char_map = { + [ "\\" ] = "\\", + [ "\"" ] = "\"", + [ "\b" ] = "b", + [ "\f" ] = "f", + [ "\n" ] = "n", + [ "\r" ] = "r", + [ "\t" ] = "t", +} + +local escape_char_map_inv = { [ "/" ] = "/" } +for k, v in pairs(escape_char_map) do + escape_char_map_inv[v] = k +end + + +local function escape_char(c) + return "\\" .. (escape_char_map[c] or string.format("u%04x", c:byte())) +end + + +local function encode_nil(val) + return "null" +end + + +local function encode_table(val, stack) + local res = {} + stack = stack or {} + + -- Circular reference? + if stack[val] then error("circular reference") end + + stack[val] = true + + if rawget(val, 1) ~= nil or next(val) == nil then + -- Treat as array -- check keys are valid and it is not sparse + local n = 0 + for k in pairs(val) do + if type(k) ~= "number" then + error("invalid table: mixed or invalid key types") + end + n = n + 1 + end + if n ~= #val then + error("invalid table: sparse array") + end + -- Encode + for i, v in ipairs(val) do + table.insert(res, encode(v, stack)) + end + stack[val] = nil + return "[" .. table.concat(res, ",") .. "]" + + else + -- Treat as an object + for k, v in pairs(val) do + if type(k) ~= "string" then + error("invalid table: mixed or invalid key types") + end + table.insert(res, encode(k, stack) .. ":" .. encode(v, stack)) + end + stack[val] = nil + return "{" .. table.concat(res, ",") .. "}" + end +end + + +local function encode_string(val) + return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"' +end + + +local function encode_number(val) + -- Check for NaN, -inf and inf + if val ~= val or val <= -math.huge or val >= math.huge then + error("unexpected number value '" .. tostring(val) .. "'") + end + return string.format("%.14g", val) +end + + +local type_func_map = { + [ "nil" ] = encode_nil, + [ "table" ] = encode_table, + [ "string" ] = encode_string, + [ "number" ] = encode_number, + [ "boolean" ] = tostring, +} + + +encode = function(val, stack) + local t = type(val) + local f = type_func_map[t] + if f then + return f(val, stack) + end + error("unexpected type '" .. t .. "'") +end + + +function json.encode(val) + return ( encode(val) ) +end + + +------------------------------------------------------------------------------- +-- Decode +------------------------------------------------------------------------------- + +local parse + +local function create_set(...) + local res = {} + for i = 1, select("#", ...) do + res[ select(i, ...) ] = true + end + return res +end + +local space_chars = create_set(" ", "\t", "\r", "\n") +local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",") +local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u") +local literals = create_set("true", "false", "null") + +local literal_map = { + [ "true" ] = true, + [ "false" ] = false, + [ "null" ] = nil, +} + + +local function next_char(str, idx, set, negate) + for i = idx, #str do + if set[str:sub(i, i)] ~= negate then + return i + end + end + return #str + 1 +end + + +local function decode_error(str, idx, msg) + local line_count = 1 + local col_count = 1 + for i = 1, idx - 1 do + col_count = col_count + 1 + if str:sub(i, i) == "\n" then + line_count = line_count + 1 + col_count = 1 + end + end + error( string.format("%s at line %d col %d", msg, line_count, col_count) ) +end + + +local function codepoint_to_utf8(n) + -- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixa + local f = math.floor + if n <= 0x7f then + return string.char(n) + elseif n <= 0x7ff then + return string.char(f(n / 64) + 192, n % 64 + 128) + elseif n <= 0xffff then + return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128) + elseif n <= 0x10ffff then + return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128, + f(n % 4096 / 64) + 128, n % 64 + 128) + end + error( string.format("invalid unicode codepoint '%x'", n) ) +end + + +local function parse_unicode_escape(s) + local n1 = tonumber( s:sub(1, 4), 16 ) + local n2 = tonumber( s:sub(7, 10), 16 ) + -- Surrogate pair? + if n2 then + return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000) + else + return codepoint_to_utf8(n1) + end +end + + +local function parse_string(str, i) + local res = "" + local j = i + 1 + local k = j + + while j <= #str do + local x = str:byte(j) + + if x < 32 then + decode_error(str, j, "control character in string") + + elseif x == 92 then -- `\`: Escape + res = res .. str:sub(k, j - 1) + j = j + 1 + local c = str:sub(j, j) + if c == "u" then + local hex = str:match("^[dD][89aAbB]%x%x\\u%x%x%x%x", j + 1) + or str:match("^%x%x%x%x", j + 1) + or decode_error(str, j - 1, "invalid unicode escape in string") + res = res .. parse_unicode_escape(hex) + j = j + #hex + else + if not escape_chars[c] then + decode_error(str, j - 1, "invalid escape char '" .. c .. "' in string") + end + res = res .. escape_char_map_inv[c] + end + k = j + 1 + + elseif x == 34 then -- `"`: End of string + res = res .. str:sub(k, j - 1) + return res, j + 1 + end + + j = j + 1 + end + + decode_error(str, i, "expected closing quote for string") +end + + +local function parse_number(str, i) + local x = next_char(str, i, delim_chars) + local s = str:sub(i, x - 1) + local n = tonumber(s) + if not n then + decode_error(str, i, "invalid number '" .. s .. "'") + end + return n, x +end + + +local function parse_literal(str, i) + local x = next_char(str, i, delim_chars) + local word = str:sub(i, x - 1) + if not literals[word] then + decode_error(str, i, "invalid literal '" .. word .. "'") + end + return literal_map[word], x +end + + +local function parse_array(str, i) + local res = {} + local n = 1 + i = i + 1 + while 1 do + local x + i = next_char(str, i, space_chars, true) + -- Empty / end of array? + if str:sub(i, i) == "]" then + i = i + 1 + break + end + -- Read token + x, i = parse(str, i) + res[n] = x + n = n + 1 + -- Next token + i = next_char(str, i, space_chars, true) + local chr = str:sub(i, i) + i = i + 1 + if chr == "]" then break end + if chr ~= "," then decode_error(str, i, "expected ']' or ','") end + end + return res, i +end + + +local function parse_object(str, i) + local res = {} + i = i + 1 + while 1 do + local key, val + i = next_char(str, i, space_chars, true) + -- Empty / end of object? + if str:sub(i, i) == "}" then + i = i + 1 + break + end + -- Read key + if str:sub(i, i) ~= '"' then + decode_error(str, i, "expected string for key") + end + key, i = parse(str, i) + -- Read ':' delimiter + i = next_char(str, i, space_chars, true) + if str:sub(i, i) ~= ":" then + decode_error(str, i, "expected ':' after key") + end + i = next_char(str, i + 1, space_chars, true) + -- Read value + val, i = parse(str, i) + -- Set + res[key] = val + -- Next token + i = next_char(str, i, space_chars, true) + local chr = str:sub(i, i) + i = i + 1 + if chr == "}" then break end + if chr ~= "," then decode_error(str, i, "expected '}' or ','") end + end + return res, i +end + + +local char_func_map = { + [ '"' ] = parse_string, + [ "0" ] = parse_number, + [ "1" ] = parse_number, + [ "2" ] = parse_number, + [ "3" ] = parse_number, + [ "4" ] = parse_number, + [ "5" ] = parse_number, + [ "6" ] = parse_number, + [ "7" ] = parse_number, + [ "8" ] = parse_number, + [ "9" ] = parse_number, + [ "-" ] = parse_number, + [ "t" ] = parse_literal, + [ "f" ] = parse_literal, + [ "n" ] = parse_literal, + [ "[" ] = parse_array, + [ "{" ] = parse_object, +} + + +parse = function(str, idx) + local chr = str:sub(idx, idx) + local f = char_func_map[chr] + if f then + return f(str, idx) + end + decode_error(str, idx, "unexpected character '" .. chr .. "'") +end + + +function json.decode(str) + if type(str) ~= "string" then + error("expected argument of type string, got " .. type(str)) + end + local res, idx = parse(str, next_char(str, 1, space_chars, true)) + idx = next_char(str, idx, space_chars, true) + if idx <= #str then + decode_error(str, idx, "trailing garbage") + end + return res +end + + +return json diff --git a/.config/awesome/quarrel/math.lua b/.config/awesome/quarrel/math.lua index bc1f53b..886ce13 100644 --- a/.config/awesome/quarrel/math.lua +++ b/.config/awesome/quarrel/math.lua @@ -1,6 +1,9 @@ local qmath = {} function qmath.step_value(value, steps) + if value > steps[#steps - 1][1] then + return steps[#steps - 1][2] + end for i, step in ipairs(steps) do if step[1] <= value and value <= steps[i + 1][1] then return step[2] diff --git a/.config/awesome/quarrel/native/Cargo.toml b/.config/awesome/quarrel/native/Cargo.toml index fdabea0..6c44528 100644 --- a/.config/awesome/quarrel/native/Cargo.toml +++ b/.config/awesome/quarrel/native/Cargo.toml @@ -14,6 +14,7 @@ rayon = "1.6.1" serde = { version = "1.0.152", features = [ "derive" ] } url = "2.3.1" rodio = "0.17.1" +nix = "0.26.2" [lib] crate-type = ["cdylib"] diff --git a/.config/awesome/quarrel/native/src/lenses/calculator.rs b/.config/awesome/quarrel/native/src/lenses/calculator.rs index 89b738e..c79dd42 100644 --- a/.config/awesome/quarrel/native/src/lenses/calculator.rs +++ b/.config/awesome/quarrel/native/src/lenses/calculator.rs @@ -13,14 +13,7 @@ use crate::lenses::entry::{ pub fn query<'a>(lua: &Lua, input: String) -> LuaResult { 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), - } - ) + format!("{result}") } Err(_) => return lua.create_table(), }; diff --git a/.config/awesome/quarrel/native/src/lib.rs b/.config/awesome/quarrel/native/src/lib.rs index d265d2d..e21e306 100644 --- a/.config/awesome/quarrel/native/src/lib.rs +++ b/.config/awesome/quarrel/native/src/lib.rs @@ -1,5 +1,5 @@ mod lenses; -// mod sound; +mod net; use mlua::prelude::*; @@ -11,6 +11,7 @@ fn qnative(lua: &Lua) -> LuaResult { let exports = lua.create_table()?; exports.set("lenses", lenses)?; + exports.set("get_essid", lua.create_function(net::get_first_essid)?)?; Ok(exports) } diff --git a/.config/awesome/quarrel/native/src/net/mod.rs b/.config/awesome/quarrel/native/src/net/mod.rs new file mode 100644 index 0000000..c9d617c --- /dev/null +++ b/.config/awesome/quarrel/native/src/net/mod.rs @@ -0,0 +1,113 @@ +// This is an attempt to port the iwgetid and iwlib code + +mod wireless; +use std::{ + ffi::{ + c_char, + c_int, + c_uchar, + c_void, + }, + mem::size_of, + os::fd::RawFd, + str, +}; + +use mlua::prelude::*; +use nix::{ + ioctl_read_bad, + libc::IF_NAMESIZE, + sys::socket::{ + socket as open_socket, + AddressFamily, + SockFlag, + SockType, + }, + unistd::close +}; +use wireless::{ + IfConf, + IfConfData, + IwPoint, + IwReq, + IwReqData, + IwReqName, + IW_ESSID_MAX_SIZE, + SIOCGIFCONF, + SIOCGIWESSID, +}; + +ioctl_read_bad!(ioctl_get_interfaces, SIOCGIFCONF, IfConf); +ioctl_read_bad!(ioctl_get_essid, SIOCGIWESSID, IwReq); + +pub fn get_first_essid(_: &Lua, _: ()) -> LuaResult { + type Buffer = [c_char; 1024]; + let mut buffer: Buffer = [0; 1024]; + + let mut if_conf = IfConf { + ifc_len: size_of::() as c_int, + data: IfConfData { + ifc_buf: buffer.as_mut_ptr(), + }, + }; + + let mut if_req; + let socket = get_first_socket().map_err(LuaError::external)?; + + unsafe { + ioctl_get_interfaces(socket, &mut if_conf).map_err(LuaError::external)?; + if_req = if_conf.data.ifc_req; + } + + for _ in 0..if_conf.ifc_len / size_of::() as c_int { + if let Ok(essid) = get_essid(socket, unsafe { *if_req }.ifr_name) { + close(socket).map_err(LuaError::external)?; + return Ok(essid); + }; + + unsafe { if_req = if_req.add(1) }; + } + + close(socket).map_err(LuaError::external)?; + Err(LuaError::external("couldn't find any valid interfaces")) +} + +fn get_essid(socket: RawFd, if_name: [c_char; IF_NAMESIZE]) -> LuaResult { + let mut essid: [c_uchar; (IW_ESSID_MAX_SIZE + 1) as usize] = + [0; (IW_ESSID_MAX_SIZE + 1) as usize]; + let mut wrq = IwReq { + ifr_ifrn: IwReqName { ifrn_name: if_name }, + u: IwReqData { + essid: IwPoint { + pointer: essid.as_mut_ptr().cast::(), + length: IW_ESSID_MAX_SIZE + 1, + flags: 0, + }, + }, + }; + + unsafe { + ioctl_get_essid(socket, &mut wrq).map_err(LuaError::external)?; + } + + Ok(str::from_utf8(essid.as_slice()) + .map_err(LuaError::external)? + .to_owned()) +} + +fn get_first_socket() -> LuaResult { + let families = [ + AddressFamily::Inet, + AddressFamily::Ipx, + AddressFamily::Ax25, + AddressFamily::AppleTalk, + ]; + + for family in families { + if let Ok(socket) = open_socket(family, SockType::Datagram, SockFlag::empty(), None) { + return Ok(socket); + } + } + + Err(LuaError::external("couldn't get a valid kernel socket")) +} diff --git a/.config/awesome/quarrel/native/src/net/wireless.rs b/.config/awesome/quarrel/native/src/net/wireless.rs new file mode 100644 index 0000000..d3999db --- /dev/null +++ b/.config/awesome/quarrel/native/src/net/wireless.rs @@ -0,0 +1,104 @@ +use std::ffi::{ + c_char, + c_int, + c_void, +}; + +use nix::libc::{ + __s16, + __s32, + __u16, + __u8, + ifreq as IfReq, + sockaddr as SockAddr, + IF_NAMESIZE, +}; + +pub static SIOCGIFCONF: c_int = 0x8912; +pub static SIOCGIWESSID: c_int = 0x8B1B; +pub const IW_ESSID_MAX_SIZE: u16 = 32; + +#[repr(C)] +pub struct IfConf { + pub ifc_len: c_int, + pub data: IfConfData, +} + +#[repr(C)] +pub union IfConfData { + pub ifc_req: *mut IfReq, + pub ifc_buf: *mut c_char, +} + +#[repr(C)] +#[derive(Copy, Clone)] +pub struct IwPoint { + pub pointer: *mut c_void, + pub length: __u16, + pub flags: __u16, +} + +#[repr(C)] +#[derive(Copy, Clone)] +pub struct IwFreq { + pub m: __s32, + pub e: __s16, + pub i: __u8, + pub flags: __u8, +} + +#[repr(C)] +#[derive(Copy, Clone)] +pub struct IwParam { + pub value: __s32, + pub fixed: __u8, + pub disabled: __u8, + pub flags: __u16, +} + +#[repr(C)] +#[derive(Copy, Clone)] +pub struct IwQuality { + pub qual: __u8, + pub level: __u8, + pub noise: __u8, + pub updated: __u8, +} + +#[repr(C)] +pub struct IwReq { + pub ifr_ifrn: IwReqName, + pub u: IwReqData, +} + +#[repr(C)] +pub union IwReqName { + pub ifrn_name: [c_char; IF_NAMESIZE], +} + +#[repr(C)] +pub union IwReqData { + pub name: [c_char; IF_NAMESIZE], + + pub essid: IwPoint, + pub nwid: IwParam, + pub freq: IwFreq, + + pub sens: IwParam, + pub bitrate: IwParam, + pub txpower: IwParam, + pub rts: IwParam, + pub frag: IwParam, + pub mode: u32, + pub retry: IwParam, + + pub encoding: IwPoint, + pub power: IwParam, + pub qual: IwQuality, + + pub ap_addr: SockAddr, + pub addr: SockAddr, + + pub param: IwParam, + pub data: IwPoint, +} diff --git a/.config/awesome/quarrel/native/src/sound.rs b/.config/awesome/quarrel/native/src/sound.rs deleted file mode 100644 index c398d70..0000000 --- a/.config/awesome/quarrel/native/src/sound.rs +++ /dev/null @@ -1,17 +0,0 @@ -use std::{ - fs::File, - io::BufReader, - path::Path, - time::Duration, -}; - -use mlua::prelude::*; -use rodio::{ - Decoder, - OutputStream, - Sink, -}; - -pub fn play_sound(_: &Lua, file: String) -> LuaResult<()> { - -} diff --git a/.config/awesome/quarrel/service.lua b/.config/awesome/quarrel/service.lua new file mode 100644 index 0000000..2c77651 --- /dev/null +++ b/.config/awesome/quarrel/service.lua @@ -0,0 +1,18 @@ +local gtimer = require "gears.timer" + +local qservice = {} + +function qservice.register(name, service, icon) + gtimer { + timeout = 1, + call_now = true, + autostart = true, + callback = function() + local service_result = table.pack(service()) + awesome.emit_signal("services::" .. name, table.unpack(service_result)) + awesome.emit_signal("services::" .. name .. "::icon", icon(table.unpack(service_result))) + end + } +end + +return qservice diff --git a/.config/awesome/quarrel/vars.lua b/.config/awesome/quarrel/vars.lua index 76d0b94..391e875 100644 --- a/.config/awesome/quarrel/vars.lua +++ b/.config/awesome/quarrel/vars.lua @@ -34,10 +34,10 @@ local char_width, char_height = wibox.widget { 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.expanded_bar_size = qvars.bar_size * 6 +qvars.element_size = dpi(12) +qvars.expanded_bar_size = qvars.big_padding + (qvars.big_padding * 2 + qvars.element_size * 4) * 3 + qvars.padding * 2 qvars.colors = { fg = x_col.foreground, diff --git a/.config/awesome/services/battery.lua b/.config/awesome/services/battery.lua deleted file mode 100644 index c2a7f3e..0000000 --- a/.config/awesome/services/battery.lua +++ /dev/null @@ -1,14 +0,0 @@ -local gtimer = require "gears.timer" -local qfs = require "quarrel.fs" - -gtimer { - timeout = 1, - call_now = true, - autostart = true, - callback = function() - local capacity = qfs.read("/sys/class/power_supply/BAT0/capacity", "n") - local status = qfs.read("/sys/class/power_supply/BAT0/status", "l") - - awesome.emit_signal("services::battery", capacity, status) - end -} diff --git a/.config/awesome/services/brightness.lua b/.config/awesome/services/brightness.lua deleted file mode 100644 index b8d07e7..0000000 --- a/.config/awesome/services/brightness.lua +++ /dev/null @@ -1,13 +0,0 @@ -local gtimer = require "gears.timer" -local qfs = require "quarrel.fs" - -gtimer { - timeout = 1, - call_now = true, - autostart = true, - callback = function() - local brightness = qfs.read("/sys/class/backlight/amdgpu_bl0/actual_brightness", "n") - - awesome.emit_signal("services::brightness", brightness) - end -} diff --git a/.config/awesome/services/common.lua b/.config/awesome/services/common.lua new file mode 100644 index 0000000..07300db --- /dev/null +++ b/.config/awesome/services/common.lua @@ -0,0 +1,118 @@ +local qfs = require "quarrel.fs" +local gfs = require "gears.filesystem" +local qservice = require "quarrel.service" +local qjson = require "quarrel.json" +local qnative = require "quarrel.native" +local gcolor = require "gears.color" +local qmath = require "quarrel.math" +local phosphor = require "assets.phosphor" +local qvars = require "quarrel.vars" + +-- follows the format `service = { provider, icon_provider }` +local services = { + audio = { + -- volume, muted + function() + if not gfs.file_readable("/tmp/wp_audio_status") then + awesome.emit_signal("services::audio", -1, false) + return + end + local audio_status = qjson.decode(qfs.read("/tmp/wp_audio_status")) + local default_sink = audio_status["alsa_output.usb-046d_G435_Wireless_Gaming_Headset_V001008005.1-01.analog-stereo"] + + if not default_sink then + return nil, false + end + + return default_sink.volume, default_sink.muted + end, + function(volume, muted) + if muted or not volume then + return gcolor.recolor_image(phosphor["speaker_simple_x_fill"], qvars.colors.red) + end + + local icon_data = qmath.step_value(volume, { + { 0, "slash" }, + { 25, "none" }, + { 50, "low" }, + { 75, "high" }, + { 100 } + }) + + gcolor.recolor_image(phosphor["speaker_simple_" .. icon_data .. "_fill"], qvars.colors.fg) + end + }, + battery = { + -- capacity, status + function() + return qfs.read("/sys/class/power_supply/BAT0/capacity", "n"), qfs.read("/sys/class/power_supply/BAT0/status", "l") + end, + function(capacity, status) + local icon_data = status == "Charging" and { "charging", "green" } or qmath.step_value(capacity, { + { 0, { "empty", "red" } }, + { 20, { "low", "red" } }, + { 40, { "medium", "yellow" } }, + { 60, { "high", "green" } }, + { 80, { "full", "green" } }, + { 100 } + }) + + return gcolor.recolor_image(phosphor["battery_vertical_" .. icon_data[1] .. "_fill"], qvars.colors[icon_data[2]]) + end + }, + brightness = { + -- brightness + function() + return qfs.read("/sys/class/backlight/amdgpu_bl0/actual_brightness", "n") + end, + function(brightness) + local icon_data = qmath.step_value(brightness, { + { 0, "cloud_moon" }, + { 51, "moon" }, + { 102, "sun_horizon" }, + { 153, "sun_dim" }, + { 204, "sun" }, + { 255 } + }) + + return gcolor.recolor_image(phosphor[icon_data .. "_fill"], qvars.colors.fg) + end + }, + wifi = { + -- essid, strength, connected + function() + local lines = {} + + for line in io.lines("/proc/net/wireless") do + table.insert(lines, line) + end + + if not lines[3] then + return nil, 0, false + end + + local strength = lines[3]:match("^%s*(.*)"):match("^.-%s+.-%s+.-(%S+)%.") + + return qnative.get_essid(), math.floor(tonumber(strength) * 10 / 7), true + end, + function(_, strength, connected) + if not connected then + return gcolor.recolor_image(phosphor.wifi_x_fill, qvars.colors.red) + end + + local icon_data = qmath.step_value(strength, { + { 0, { "none", "red" } }, + { 25, { "low", "yellow" } }, + { 50, { "medium", "yellow" } }, + { 75, { "high", "green" } }, + { 100 } + }) + + return gcolor.recolor_image(phosphor["wifi_" .. icon_data[1] .. "_fill"], qvars.colors[icon_data[2]]) + end + } +} + +for name, service in pairs(services) do + qservice.register(name, service[1], service[2]) +end diff --git a/.config/awesome/services/init.lua b/.config/awesome/services/init.lua index 23f6dd3..82e2096 100644 --- a/.config/awesome/services/init.lua +++ b/.config/awesome/services/init.lua @@ -1,3 +1,2 @@ -require "services.battery" -require "services.brightness" -require "services.wifi" +require "services.playerctl" +require "services.common" diff --git a/.config/awesome/services/playerctl.lua b/.config/awesome/services/playerctl.lua new file mode 100644 index 0000000..01598f8 --- /dev/null +++ b/.config/awesome/services/playerctl.lua @@ -0,0 +1,45 @@ +local playerctl = require "lib.bling.signal.playerctl".lib { + player = { "spotify", "ncmpcpp", "%any" } +} + +playerctl:connect_signal("metadata", function(...) + awesome.emit_signal("services::playerctl::metadata", ...) +end) + +playerctl:connect_signal("position", function(...) + awesome.emit_signal("services::playerctl::position", ...) +end) + +playerctl:connect_signal("playback_status", function(...) + awesome.emit_signal("services::playerctl::playback_status", ...) +end) + +playerctl:connect_signal("seeked", function(...) + awesome.emit_signal("services::playerctl::seeked", ...) +end) + +playerctl:connect_signal("volume", function(...) + awesome.emit_signal("services::playerctl::volume", ...) +end) + +playerctl:connect_signal("loop_status", function(...) + awesome.emit_signal("services::playerctl::loop_status", ...) +end) + +playerctl:connect_signal("shuffle", function(...) + awesome.emit_signal("services::playerctl::shuffle", ...) +end) + +playerctl:connect_signal("exit", function(...) + awesome.emit_signal("services::playerctl::exit", ...) +end) + +playerctl:connect_signal("exit", function(...) + awesome.emit_signal("services::playerctl::exit", ...) +end) + +playerctl:connect_signal("no_players", function() + awesome.emit_signal("services::playerctl::no_players") +end) + +return playerctl diff --git a/.config/awesome/services/wifi.lua b/.config/awesome/services/wifi.lua deleted file mode 100644 index f6b67f1..0000000 --- a/.config/awesome/services/wifi.lua +++ /dev/null @@ -1,23 +0,0 @@ -local gtimer = require "gears.timer" - -gtimer { - timeout = 1, - call_now = true, - autostart = true, - callback = function() - local lines = {} - - for line in io.lines("/proc/net/wireless") do - table.insert(lines, line) - end - - if not lines[3] then - awesome.emit_signal("services::wifi", 0, false) - return - end - - local strength = lines[3]:match("^%s*(.*)"):match("^.-%s+.-%s+.-(%S+)%.") - - awesome.emit_signal("services::wifi", math.floor(tonumber(strength) * 10 / 7), true) - end -} diff --git a/.config/awesome/ui/archaic/init.lua b/.config/awesome/ui/archaic/init.lua deleted file mode 100644 index df7bbda..0000000 --- a/.config/awesome/ui/archaic/init.lua +++ /dev/null @@ -1,238 +0,0 @@ -local awful = require "awful" -local btn = awful.button.names -local gc = require "gears.color" -local gs = require "gears.surface" -local qvars = require "quarrel.vars" -local qui = require "quarrel.ui" -local wibox = require "wibox" -local beautiful = require "beautiful" -local rubato = require "lib.rubato" -local playerctl = require "lib.bling.signal.playerctl".lib { - player = { "spotify", "cmus", "%any" } -} - -local height = screen[1].geometry.height - (beautiful.useless_gap * 4 + qvars.border_width * 2) -local inside_width = qvars.bar_size * 20 - (qvars.big_padding * 4 + qvars.border_width * 4 + qvars.bar_size * 4) - -local cover = wibox.widget { - { - widget = wibox.widget.imagebox, - clip_shape = qvars.shape, - forced_width = qvars.bar_size * 4, - forced_height = qvars.bar_size * 4, - visible = false, - id = "cover" - }, - { - widget = wibox.container.background, - forced_width = qvars.bar_size * 4, - forced_height = qvars.bar_size * 4, - bg = qvars.colors.black, - fg = qvars.colors.dim.fg, - shape = qvars.shape, - { - widget = wibox.container.place, - { - widget = wibox.widget.textbox, - text = "󰝚", - font = qui.font(4) - } - }, - id = "no_cover" - }, - layout = wibox.layout.stack -} - -local song = wibox.widget { - widget = wibox.widget.textbox, - text = "Nothing Playing ", - id = "song" -} - -local artist = wibox.widget { - widget = wibox.widget.textbox, - markup = qui.markup_fg(qvars.colors.dim.fg, "Nothing Playing "), - font = qui.font(0.8), -} - -local back = wibox.widget { - widget = wibox.widget.textbox, - text = "", - font = qui.symbol_font(1.5), - forced_height = beautiful.get_font_height(qui.symbol_font(0.5)) -} -back:add_button(awful.button { - modifiers = {}, - button = btn.LEFT, - on_press = function() - playerctl:previous() - end -}) - -local play_pause = wibox.widget { - widget = wibox.widget.textbox, - text = "", - font = qui.font(1.5), - forced_height = beautiful.get_font_height(qui.font(0.5)) -} -play_pause:add_button(awful.button { - modifiers = {}, - button = btn.LEFT, - on_press = function() - playerctl:play_pause() - end -}) -playerctl:connect_signal("playback_status", function(_, playing) - if playing then - play_pause:set_text("") - else - play_pause:set_text("") - end -end) - -local forward = wibox.widget { - widget = wibox.widget.textbox, - text = "", - font = qui.font(1.5), - forced_height = beautiful.get_font_height(qui.font(0.5)) -} -forward:add_button(awful.button { - - modifiers = {}, - button = btn.LEFT, - on_press = function() - playerctl:next() - end -}) - -local progress_bar = wibox.widget { - widget = wibox.widget.progressbar, - max_value = 1, - value = 0, - shape = qvars.shape, - bar_shape = qvars.shape, - forced_height = beautiful.get_font_height(qui.font(0.5)), - forced_width = inside_width - (qvars.padding * 2 + qvars.big_padding + back:get_preferred_size_at_dpi(screen[1].dpi) * 3), - color = qvars.colors.yellow, - background_color = qvars.colors.black -} -local progress_smoothing = rubato.timed { - duration = qvars.anim_duration, - intro = qvars.anim_intro, - pos = 0, - subscribed = function(pos) - progress_bar.value = pos - end -} -playerctl:connect_signal("position", function(_, pos, len) - -- progress_bar.value = pos - progress_smoothing.target = pos - progress_bar.max_value = len -end) - -local archaic = {} - -archaic.playerctl = playerctl - -archaic.widget = qui.popup { - placement = function(d) - return awful.placement.right(d, { - margins = beautiful.useless_gap * 2 - }) - end, - ontop = true, - minimum_width = qvars.bar_size * 20, - maximum_width = qvars.bar_size * 20, - minimum_height = height, - maximum_height = height, - widget = { - qui.styled { - widget = wibox.container.background, - { - widget = wibox.container.margin, - margins = qvars.big_padding, - { - cover, - { - { - { - { - widget = wibox.container.scroll.horizontal, - speed = 40, - fps = 60, - step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth, - song - }, - { - widget = wibox.container.scroll.horizontal, - speed = 40, - fps = 60, - step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth, - artist - }, - layout = wibox.layout.fixed.vertical - }, - { - widget = wibox.container.background, - bg = gc { - type = "linear", - from = { 0, 0 }, - to = { inside_width, 0 }, - -- ^-------------------------------------------------------------------------------------- 270px - stops = { - { 0, "#0000000" }, - { 0.95, "#0000000" }, - { 0.95, qvars.colors.bg .. "1a" }, - { 1, qvars.colors.bg } - } - } - }, - layout = wibox.layout.stack - }, - nil, - { - progress_bar, - { - back, - play_pause, - forward, - - spacing = qvars.padding, - layout = wibox.layout.fixed.horizontal - }, - spacing = qvars.big_padding, - layout = wibox.layout.fixed.horizontal - }, - layout = wibox.layout.align.vertical - }, - spacing = qvars.big_padding - qvars.border_width, -- for some reason awesome adds border_width here - layout = wibox.layout.fixed.horizontal - } - } - }, - layout = wibox.layout.fixed.vertical - } -} - -playerctl:connect_signal("metadata", function(_, _song, _artist, _cover) - -- n { message = "sus" } - song:set_text(_song .. " ") - -- ic.widget:emit_signal("widget::redraw_needed") - artist:set_markup(qui.markup_fg(qvars.colors.dim.fg, _artist .. " ")) - if _cover == "" then - cover.cover.visible = false - cover.no_cover.visible = true - return - end - cover.cover.image = gs.load_uncached(_cover) - cover.cover.visible = true - cover.no_cover.visible = false -end) - -function archaic:toggle() - self.widget.visible = not self.widget.visible -end - -archaic:toggle() - -return archaic diff --git a/.config/awesome/ui/decorations/init.lua b/.config/awesome/ui/decorations/init.lua index 9493a67..5b33dc3 100644 --- a/.config/awesome/ui/decorations/init.lua +++ b/.config/awesome/ui/decorations/init.lua @@ -1,2 +1,2 @@ -require "ui.decorations.titlebar" require "ui.decorations.wallpaper" +-- require "ui.decorations.clippy" diff --git a/.config/awesome/ui/decorations/titlebar.lua b/.config/awesome/ui/decorations/titlebar.lua deleted file mode 100644 index ab96457..0000000 --- a/.config/awesome/ui/decorations/titlebar.lua +++ /dev/null @@ -1,84 +0,0 @@ -local awful = require "awful" -local cfg = require "misc.cfg" -local gears = require "gears" -local qvars = require "quarrel.vars" -local rubato = require "lib.rubato" -local wibox = require "wibox" - -local function button(color, color_focus, callback) - local widget = wibox.widget { - widget = wibox.container.background, - forced_height = qvars.button_size, - forced_width = qvars.button_size, - bg = color, - shape = qvars.shape, - buttons = { callback } - } - - widget:connect_signal("mouse::enter", function() - local timed = rubato.timed { - duration = 0.1, - intro = 0.05, - pos = qvars.button_size, - subscribed = function(pos) - widget.forced_width = pos - end - } - - timed.target = qvars.button_size * 2 - widget.bg = color_focus - end) - - widget:connect_signal("mouse::leave", function() - local timed = rubato.timed { - duration = 0.1, - intro = 0.05, - pos = qvars.button_size * 2, - subscribed = function(pos) - widget.forced_width = pos - end - } - - timed.target = qvars.button_size - widget.bg = color - end) - - return widget -end - -client.connect_signal("request::titlebars", function(c) - if not cfg.draw_titlebar then return end - - local titlebar = awful.titlebar(c, { - position = "top", - size = qvars.button_size + qvars.padding * 2 - }) - - awful.titlebar.enable_tooltip = false - - titlebar.widget = { - widget = wibox.container.margin, - margins = qvars.padding, - { - nil, - nil, - { - button(qvars.colors.green, qvars.colors.bright.green, awful.button({}, 1, function() - c.maximized = not c.maximized - end)), - button(qvars.colors.yellow, qvars.colors.bright.yellow, awful.button({}, 1, function() - gears.timer.delayed_call(function() - c.minimized = true - end) - end)), - button(qvars.colors.red, qvars.colors.bright.red, awful.button({}, 1, function() - c:kill() - end)), - - spacing = qvars.padding, - layout = wibox.layout.fixed.horizontal - }, - layout = wibox.layout.align.horizontal - } - } -end) diff --git a/.config/awesome/ui/decorations/wallpaper.lua b/.config/awesome/ui/decorations/wallpaper.lua index e1323b8..dbe54ee 100644 --- a/.config/awesome/ui/decorations/wallpaper.lua +++ b/.config/awesome/ui/decorations/wallpaper.lua @@ -25,7 +25,8 @@ screen.connect_signal("request::wallpaper", function(s) }, "\n") } -- { - -- image = gfs.get_configuration_dir() .. "assets/nightmare_fuel.png", + -- -- image = gfs.get_configuration_dir() .. "assets/nightmare_fuel.png", + -- image = "/home/delta/Desktop/offline vs online.jpg", -- resize = true, -- widget = wibox.widget.imagebox, -- }, diff --git a/.config/awesome/ui/flashy/init.lua b/.config/awesome/ui/flashy/init.lua deleted file mode 100644 index 68f1e13..0000000 --- a/.config/awesome/ui/flashy/init.lua +++ /dev/null @@ -1,74 +0,0 @@ -local awful = require "awful" -local beautiful = require "beautiful" -local gcolor = require "gears.color" -local gdebug = require "gears.debug" -local gtable = require "gears.table" -local phosphor = require "assets.phosphor" -local qui = require "quarrel.ui" -local qvars = require "quarrel.vars" -local rubato = require "lib.rubato" -local wibox = require "wibox" - -local flashy = {} -flashy._timeout_timer = {} - -flashy._widget = qui.popup { - placement = awful.placement.centered, - ontop = true, - minimum_width = qvars.button_size * 15, - maximum_width = qvars.button_size * 15, - minimum_height = qvars.button_size * 15, - maximum_height = qvars.button_size * 15, - visible = false, - widget = { - { - widget = wibox.container.place, - valign = "center", - haligh = "center", - -- widget = wibox.container.margin, - -- margins = qvars.big_padding * 8, - { - widget = wibox.widget.imagebox, - image = gcolor.recolor_image(phosphor.battery_warning, qvars.colors.fg), - -- image = phosphor["battery_warning"], - forced_width = qvars.button_size * 15 - (qvars.border_width * 2 + qvars.big_padding * 2), - forced_height = qvars.button_size * 14 - (qvars.border_width * 2 + qvars.big_padding * 2) - } - }, - { - widget = wibox.widget.progressbar, - max_value = 100, - value = 50, - forced_height = qvars.button_size; - shape = qvars.shape, - color = qvars.colors.yellow, - background_color = qvars.colors.black - }, - layout = wibox.layout.fixed.vertical - } -} - -flashy._timed = rubato.timed { - duration = qvars.anim_duration, - intro = qvars.anim_intro, - pos = 0, - subscribed = function(pos) - flashy._widget.opacity = pos - - if pos == 0 then - flashy._widget.visible = false - else - flashy._widget.visible = true - end - end -} - -function flashy:show() - self._timed.target = 1 -end - -function flashy:hide() - self._timed.target = 0 -end - -return flashy diff --git a/.config/awesome/ui/init.lua b/.config/awesome/ui/init.lua index 9ab3019..e41644f 100644 --- a/.config/awesome/ui/init.lua +++ b/.config/awesome/ui/init.lua @@ -1,5 +1,2 @@ --- require "ui.window_switcher" --- require "ui.conductor" require "ui.statusbar" --- require "ui.info_center" require "ui.decorations" diff --git a/.config/awesome/ui/statusbar/init.lua b/.config/awesome/ui/statusbar/init.lua index e923473..7400a76 100644 --- a/.config/awesome/ui/statusbar/init.lua +++ b/.config/awesome/ui/statusbar/init.lua @@ -14,6 +14,7 @@ local brightness = require "ui.statusbar.widgets.brightness" local clock = require "ui.statusbar.widgets.clock" local keyboardlayout = require "ui.statusbar.widgets.keyboardlayout" local taglist = require "ui.statusbar.widgets.taglist" +local volume = require "ui.statusbar.widgets.volume" local wifi = require "ui.statusbar.widgets.wifi" screen.connect_signal("request::desktop_decoration", function(s) @@ -24,8 +25,8 @@ screen.connect_signal("request::desktop_decoration", function(s) { widget = wibox.widget.imagebox, image = gcolor.recolor_image(phosphor.caret_right_fill, qvars.colors.fg), - forced_width = qvars.icon_size, - forced_height = qvars.icon_size + forced_width = qvars.char_height, + forced_height = qvars.char_height }, _expanded = false } @@ -51,14 +52,15 @@ screen.connect_signal("request::desktop_decoration", function(s) widget = wibox.container.place, valign = "bottom", { + brightness, + volume, + battery, + wifi, { widget = wibox.container.place, keyboardlayout }, clock, - wifi, - brightness, - battery, layout = wibox.layout.fixed.vertical, spacing = qvars.padding * 2 }, @@ -69,7 +71,7 @@ screen.connect_signal("request::desktop_decoration", function(s) nil, nil, layout = wibox.layout.align.horizontal, - } + }, } local bar_width = bar.width + qvars.border_width * 2 @@ -78,6 +80,8 @@ screen.connect_signal("request::desktop_decoration", function(s) left = bar_width + beautiful.useless_gap * 4 } + local panel_width + local timed = rubato.timed { duration = qvars.anim_duration, intro = qvars.anim_intro, @@ -85,6 +89,9 @@ screen.connect_signal("request::desktop_decoration", function(s) subscribed = function(pos) if pos ~= bar_width and expand_button._expanded then bar.widget.widget.third = panel + if panel_width == nil then + panel_width = bar.widget.widget.third.width + end bar.ontop = true elseif pos == bar_width and not expand_button._expanded then bar.widget.widget.third = nil @@ -104,12 +111,15 @@ screen.connect_signal("request::desktop_decoration", function(s) if expand_button._expanded then timed.target = bar_width else - timed.target = bar_width + qvars.bar_size * 6 + timed.target = bar_width + qvars.expanded_bar_size + -- timed.target = bar_width + qvars.big_padding + (qvars.big_padding * 2 + qvars.element_size * 4) * 3 + qvars.padding * 2 end + -- q.debug(tostring(panel_width)) expand_button._expanded = not expand_button._expanded end, hidden = true } } + end) diff --git a/.config/awesome/ui/statusbar/panel/init.lua b/.config/awesome/ui/statusbar/panel/init.lua index fe66789..b9b414c 100644 --- a/.config/awesome/ui/statusbar/panel/init.lua +++ b/.config/awesome/ui/statusbar/panel/init.lua @@ -1,65 +1,46 @@ local qvars = require "quarrel.vars" local wibox = require "wibox" -local battery_bar = require "ui.statusbar.panel.widgets.battery_bar" -local brightness_bar = require "ui.statusbar.panel.widgets.brightness_bar" +local displays = require "ui.statusbar.panel.widgets.displays" +local power_menu = require "ui.statusbar.panel.widgets.power_menu" + local panel = wibox.widget { - { + -- widget = wibox.container.constraint, + -- width = qvars.expanded_bar_size, + -- strategy = "exact", + -- { widget = wibox.container.margin, margins = { - left = qvars.big_padding * 2 - } - }, - { - widget = wibox.container.constraint, - width = qvars.bar_size * 6, - strategy = "exact", + left = qvars.big_padding + }, { - widget = wibox.container.margin, - margins = { - right = qvars.big_padding * 4 + { + widget = wibox.container.place, + valign = "top", + { + displays.battery, + displays.volume, + displays.brightness, + layout = wibox.layout.fixed.horizontal, + spacing = qvars.padding, + } }, { + widget = wibox.container.background, { - widget = wibox.widget.calendar.month, - date = os.date("*t"), - font = qvars.font, - -- long_weekdays = true, - -- flex_height = true, - -- fn_embed = decorate_cell - }, - { - widget = wibox.container.background, - -- bg = qvars.colors.blue, - { - widget = wibox.widget.textbox, - text = ":)" - } - }, - { - widget = wibox.container.place, - valign = "bottom", - { - { - widget = wibox.widget.separator, - forced_height = qvars.char_height * 4 + qvars.padding * 4, - color = qvars.colors.transparent, - }, - brightness_bar, - battery_bar, - layout = wibox.layout.fixed.vertical, - spacing = qvars.padding * 2 - }, - }, - layout = wibox.layout.align.vertical, - } + widget = wibox.widget.textbox, + text = ":)" + } + }, + { + widget = wibox.container.place, + valign = "bottom", + power_menu + }, + layout = wibox.layout.align.vertical, } - }, - layout = wibox.layout.fixed.horizontal + -- } } --- panel:get_children_by_id("ratio_layout"):adjust_ratio(2, 0.3, 0.7, 0) --- gdebug.dump(panel:get_children_by_id("ratio_layout")) - return panel diff --git a/.config/awesome/ui/statusbar/panel/widgets/battery_bar.lua b/.config/awesome/ui/statusbar/panel/widgets/battery_bar.lua deleted file mode 100644 index c1466f4..0000000 --- a/.config/awesome/ui/statusbar/panel/widgets/battery_bar.lua +++ /dev/null @@ -1,60 +0,0 @@ -local qmath = require "quarrel.math" -local qvars = require "quarrel.vars" -local wibox = require "wibox" - -local battery_bar = wibox.widget { - widget = wibox.container.place, - forced_height = qvars.char_height, - { - { - widget = wibox.container.constraint, - width = qvars.char_width * 4, - strategy = "exact", - { - widget = wibox.widget.textbox, - text = "0%" - }, - id = "text" - }, - nil, - { - widget = wibox.container.margin, - margins = { - left = qvars.padding - }, - { - widget = wibox.container.place, - { - widget = wibox.widget.progressbar, - max_value = 100, - value = 0, - forced_height = qvars.char_height / 4, - shape = qvars.shape, - background_color = qvars.colors.black, - color = qvars.colors.red, - } - }, - id = "bar" - }, - layout = wibox.layout.align.horizontal, - -- expand = "outside" - } -} - -awesome.connect_signal("services::battery", function(capacity) - local color = qmath.step_value(capacity, { - { 0, "red" }, - { 20, "red" }, - { 40, "yellow" }, - { 60, "green" }, - { 80, "green" }, - { 100 } - }) - - battery_bar.widget.bar.widget.widget.color = qvars.colors[color] - battery_bar.widget.bar.widget.widget.value = capacity - - battery_bar.widget.text.widget.text = capacity .. "%" -end) - -return battery_bar diff --git a/.config/awesome/ui/statusbar/panel/widgets/brightness_bar.lua b/.config/awesome/ui/statusbar/panel/widgets/brightness_bar.lua deleted file mode 100644 index 7d3e5f0..0000000 --- a/.config/awesome/ui/statusbar/panel/widgets/brightness_bar.lua +++ /dev/null @@ -1,46 +0,0 @@ -local qmath = require "quarrel.math" -local qvars = require "quarrel.vars" -local wibox = require "wibox" - -local brightness_bar = wibox.widget { - widget = wibox.container.place, - forced_height = qvars.char_height, - { - { - widget = wibox.widget.textbox, - text = "0%", - id = "text" - }, - nil, - { - widget = wibox.container.margin, - margins = { - left = qvars.padding - }, - { - widget = wibox.container.place, - { - widget = wibox.widget.progressbar, - max_value = 100, - value = 0, - forced_height = qvars.char_height / 4, - shape = qvars.shape, - background_color = qvars.colors.black, - color = qvars.colors.fg, - } - }, - id = "bar" - }, - layout = wibox.layout.align.horizontal, - } -} - -awesome.connect_signal("services::brightness", function(brightness) - brightness = math.floor(qmath.translate_range(brightness, 0, 255, 0, 100)) - - brightness_bar.widget.bar.widget.widget.value = brightness - - brightness_bar.widget.text.text = brightness .. "%" -end) - -return brightness_bar diff --git a/.config/awesome/ui/statusbar/panel/widgets/calendar.lua b/.config/awesome/ui/statusbar/panel/widgets/calendar.lua index e69de29..8b13789 100644 --- a/.config/awesome/ui/statusbar/panel/widgets/calendar.lua +++ b/.config/awesome/ui/statusbar/panel/widgets/calendar.lua @@ -0,0 +1 @@ + diff --git a/.config/awesome/ui/statusbar/panel/widgets/displays.lua b/.config/awesome/ui/statusbar/panel/widgets/displays.lua new file mode 100644 index 0000000..cd05253 --- /dev/null +++ b/.config/awesome/ui/statusbar/panel/widgets/displays.lua @@ -0,0 +1,104 @@ +local qmath = require "quarrel.math" +local qvars = require "quarrel.vars" +local qui = require "quarrel.ui" +local wibox = require "wibox" +local phosphor = require "assets.phosphor" +local gcolor = require "gears.color" + +local function create_display(icon, color) + return wibox.widget(qui.styled { + widget = wibox.container.background, + { + widget = wibox.container.margin, + margins = qvars.big_padding, + { + widget = wibox.container.place, + { + { + widget = wibox.container.radialprogressbar, + max_value = 100, + border_color = qvars.colors.black, + color = color, + border_width = qvars.border_width * 2, + forced_height = qvars.element_size * 4, + forced_width = qvars.element_size * 4, + { + widget = wibox.container.place, + { + widget = wibox.widget.imagebox, + image = icon, + forced_height = qvars.char_height, + forced_width = qvars.char_height, + id = "icon" + } + }, + id = "indicator" + }, + { + widget = wibox.container.place, + { + widget = wibox.widget.textbox, + text = "0%", + id = "text" + } + }, + layout = wibox.layout.fixed.vertical, + spacing = qvars.big_padding + } + } + } + }) +end + +local d_battery = create_display(gcolor.recolor_image(phosphor.battery_vertical_warning_fill, qvars.colors.fg), qvars.colors.red) + +awesome.connect_signal("services::battery", function(capacity, status) + local icon_data = status == "Charging" and { "charging", "green" } or qmath.step_value(capacity, { + { 0, { "empty", "red" } }, + { 20, { "low", "red" } }, + { 40, { "medium", "yellow" } }, + { 60, { "high", "green" } }, + { 80, { "full", "green" } }, + { 100 } + }) + + d_battery:get_children_by_id("indicator")[1].color = qvars.colors[icon_data[2]] + d_battery:get_children_by_id("indicator")[1].value = capacity + d_battery:get_children_by_id("icon")[1].image = gcolor.recolor_image(phosphor["battery_vertical_" .. icon_data[1] .. "_fill"], qvars.colors[icon_data[2]]) + + d_battery:get_children_by_id("text")[1].text = capacity .. "%" +end) + +local d_volume = create_display(gcolor.recolor_image(phosphor.speaker_simple_high_fill, qvars.colors.fg), qvars.colors.fg) + +awesome.connect_signal("services::audio", function(volume, muted) + d_volume:get_children_by_id("indicator")[1].value = math.min(volume, 100) + d_volume:get_children_by_id("text")[1].text = volume .. "%" + + if muted then + d_volume:get_children_by_id("icon")[1].image = gcolor.recolor_image(phosphor["speaker_simple_x_fill"], qvars.colors.red) + return + end + + local icon_data = qmath.step_value(volume, { + { 0, "slash" }, + { 25, "none" }, + { 50, "low" }, + { 75, "high" }, + { 100 } + }) + + d_volume:get_children_by_id("icon")[1].image = gcolor.recolor_image(phosphor["speaker_simple_" .. icon_data .. "_fill"], qvars.colors.fg) +end) + +local d_brightness = create_display(gcolor.recolor_image(phosphor.sun_fill, qvars.colors.fg), qvars.colors.fg) + +awesome.connect_signal("services::brightness", function(brightness) + brightness = math.floor(qmath.translate_range(brightness, 0, 255, 0, 100)) + + d_brightness:get_children_by_id("indicator")[1].value = brightness + + d_brightness:get_children_by_id("text")[1].text = brightness .. "%" +end) + +return { battery = d_battery, volume = d_volume, brightness = d_brightness } diff --git a/.config/awesome/ui/statusbar/panel/widgets/power_menu.lua b/.config/awesome/ui/statusbar/panel/widgets/power_menu.lua new file mode 100644 index 0000000..ffb5a76 --- /dev/null +++ b/.config/awesome/ui/statusbar/panel/widgets/power_menu.lua @@ -0,0 +1,62 @@ +local q = require "quarrel" +local qbind = require "quarrel.bind" +local qvars = require "quarrel.vars" +local qui = require "quarrel.ui" +local wibox = require "wibox" + +local power_menu = wibox.widget { + qui.styled { + widget = wibox.container.background, + bg = qvars.colors.black, + { + widget = wibox.widget.textbox, + text = "1", + buttons = { + qbind:new { + triggers = qvars.btns.left, + press = function() + q.debug("from 1") + end, + hidden = true + } + } + } + }, + qui.styled { + widget = wibox.container.background, + bg = qvars.colors.black, + { + widget = wibox.widget.textbox, + text = "2", + buttons = { + qbind:new { + triggers = qvars.btns.left, + press = function() + q.debug("from 2") + end, + hidden = true + } + } + } + }, + qui.styled { + widget = wibox.container.background, + bg = qvars.colors.black, + { + widget = wibox.widget.textbox, + text = "3", + buttons = { + qbind:new { + triggers = qvars.btns.left, + press = function() + q.debug("from 3") + end, + hidden = true + } + } + } + }, + layout = wibox.layout.flex.horizontal +} + +return power_menu diff --git a/.config/awesome/ui/statusbar/widgets/battery.lua b/.config/awesome/ui/statusbar/widgets/battery.lua index 98af803..f220ff1 100644 --- a/.config/awesome/ui/statusbar/widgets/battery.lua +++ b/.config/awesome/ui/statusbar/widgets/battery.lua @@ -10,19 +10,14 @@ local battery = wibox.widget { halign = "center", { widget = wibox.widget.imagebox, - image = gcolor.recolor_image(phosphor.battery_warning_vertical_fill, qvars.colors.red), - forced_width = qvars.icon_size, - forced_height = qvars.icon_size + image = gcolor.recolor_image(phosphor.battery_vertical_warning_fill, qvars.colors.red), + forced_width = qvars.char_height, + forced_height = qvars.char_height } } awesome.connect_signal("services::battery", function(capacity, status) - if status == "Charging" then - battery.widget.image = gcolor.recolor_image(phosphor.battery_charging_vertical_fill, qvars.colors.green) - return - end - - local icon_data = qmath.step_value(capacity, { + local icon_data = status == "Charging" and { "charging", "green" } or qmath.step_value(capacity, { { 0, { "empty", "red" } }, { 20, { "low", "red" } }, { 40, { "medium", "yellow" } }, diff --git a/.config/awesome/ui/statusbar/widgets/brightness.lua b/.config/awesome/ui/statusbar/widgets/brightness.lua index 5c1cb16..bfb8e91 100644 --- a/.config/awesome/ui/statusbar/widgets/brightness.lua +++ b/.config/awesome/ui/statusbar/widgets/brightness.lua @@ -11,8 +11,8 @@ local brightness = wibox.widget { { widget = wibox.widget.imagebox, image = gcolor.recolor_image(phosphor.moon_fill, qvars.colors.fg), - forced_width = qvars.icon_size, - forced_height = qvars.icon_size + forced_width = qvars.char_height, + forced_height = qvars.char_height } } diff --git a/.config/awesome/ui/statusbar/widgets/taglist.lua b/.config/awesome/ui/statusbar/widgets/taglist.lua index 5b479bc..10618aa 100644 --- a/.config/awesome/ui/statusbar/widgets/taglist.lua +++ b/.config/awesome/ui/statusbar/widgets/taglist.lua @@ -19,8 +19,8 @@ return awful.widget.taglist { { widget = wibox.widget.imagebox, image = gcolor.recolor_image(phosphor.circle_bold, qvars.colors.fg), - forced_width = qvars.icon_size, - forced_height = qvars.icon_size, + forced_width = qvars.char_height, + forced_height = qvars.char_height, icon = phosphor.dot_fill }, create_callback = function(self, tag) diff --git a/.config/awesome/ui/statusbar/widgets/volume.lua b/.config/awesome/ui/statusbar/widgets/volume.lua index e69de29..72723a0 100644 --- a/.config/awesome/ui/statusbar/widgets/volume.lua +++ b/.config/awesome/ui/statusbar/widgets/volume.lua @@ -0,0 +1,36 @@ +local gcolor = require "gears.color" +local phosphor = require "assets.phosphor" +local qmath = require "quarrel.math" +local qvars = require "quarrel.vars" +local wibox = require "wibox" + +local volume_widget = wibox.widget { + widget = wibox.container.place, + valign = "center", + halign = "center", + { + widget = wibox.widget.imagebox, + image = gcolor.recolor_image(phosphor.speaker_simple_slash_fill, qvars.colors.red), + forced_width = qvars.char_height, + forced_height = qvars.char_height + } +} + +awesome.connect_signal("services::audio", function(volume, muted) + if muted then + volume_widget.widget.image = gcolor.recolor_image(phosphor["speaker_simple_x_fill"], qvars.colors.red) + return + end + + local icon_data = qmath.step_value(volume, { + { 0, "slash" }, + { 25, "none" }, + { 50, "low" }, + { 75, "high" }, + { 100 } + }) + + volume_widget.widget.image = gcolor.recolor_image(phosphor["speaker_simple_" .. icon_data .. "_fill"], qvars.colors.fg) +end) + +return volume_widget diff --git a/.config/awesome/ui/statusbar/widgets/wifi.lua b/.config/awesome/ui/statusbar/widgets/wifi.lua index ec5b72c..c895b0a 100644 --- a/.config/awesome/ui/statusbar/widgets/wifi.lua +++ b/.config/awesome/ui/statusbar/widgets/wifi.lua @@ -3,6 +3,8 @@ local phosphor = require "assets.phosphor" local qmath = require "quarrel.math" local qvars = require "quarrel.vars" local wibox = require "wibox" +local q = require "quarrel" +local gdebug = require "gears.debug" local wifi = wibox.widget { widget = wibox.container.place, @@ -11,12 +13,12 @@ local wifi = wibox.widget { { widget = wibox.widget.imagebox, image = gcolor.recolor_image(phosphor.wifi_x_fill, qvars.colors.red), - forced_width = qvars.icon_size, - forced_height = qvars.icon_size + forced_width = qvars.char_height, + forced_height = qvars.char_height } } -awesome.connect_signal("services::wifi", function(strength, connected) +awesome.connect_signal("services::wifi", function(essid, strength, connected) if not connected then wifi.widget.image = gcolor.recolor_image(phosphor.wifi_x_fill, qvars.colors.red) return