restructure services, add get_essid to quarrel.native and other wip work

This commit is contained in:
delta 2023-05-12 16:18:24 +02:00
parent ea1bdf6585
commit f5612f081d
40 changed files with 1116 additions and 693 deletions

42
.Xresources Normal file
View file

@ -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

View file

Before

Width:  |  Height:  |  Size: 416 B

After

Width:  |  Height:  |  Size: 416 B

View file

Before

Width:  |  Height:  |  Size: 360 B

After

Width:  |  Height:  |  Size: 360 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" fill="#000000" viewBox="0 0 256 256"><path d="M184,152V104a8,8,0,0,1,16,0v48a8,8,0,0,1-16,0Zm40-72a8,8,0,0,0-8,8v80a8,8,0,0,0,16,0V88A8,8,0,0,0,224,80ZM53.92,34.62A8,8,0,1,0,42.08,45.38L73.55,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V175.09l42.08,46.29a8,8,0,1,0,11.84-10.76Zm92.16,77.59A8,8,0,0,0,160,106.83V32a8,8,0,0,0-12.91-6.31l-39.85,31a8,8,0,0,0-1,11.7Z"></path></svg>

After

Width:  |  Height:  |  Size: 477 B

View file

@ -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"

View file

@ -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,

View file

@ -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

View file

@ -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]

View file

@ -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"]

View file

@ -13,14 +13,7 @@ use crate::lenses::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),
}
)
format!("{result}")
}
Err(_) => return lua.create_table(),
};

View file

@ -1,5 +1,5 @@
mod lenses;
// mod sound;
mod net;
use mlua::prelude::*;
@ -11,6 +11,7 @@ fn qnative(lua: &Lua) -> LuaResult<LuaTable> {
let exports = lua.create_table()?;
exports.set("lenses", lenses)?;
exports.set("get_essid", lua.create_function(net::get_first_essid)?)?;
Ok(exports)
}

View file

@ -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<String> {
type Buffer = [c_char; 1024];
let mut buffer: Buffer = [0; 1024];
let mut if_conf = IfConf {
ifc_len: size_of::<Buffer>() 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::<IfConf>() 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<String> {
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::<c_void>(),
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<RawFd> {
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"))
}

View file

@ -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,
}

View file

@ -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<()> {
}

View file

@ -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

View file

@ -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,

View file

@ -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
}

View file

@ -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
}

View file

@ -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

View file

@ -1,3 +1,2 @@
require "services.battery"
require "services.brightness"
require "services.wifi"
require "services.playerctl"
require "services.common"

View file

@ -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

View file

@ -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
}

View file

@ -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

View file

@ -1,2 +1,2 @@
require "ui.decorations.titlebar"
require "ui.decorations.wallpaper"
-- require "ui.decorations.clippy"

View file

@ -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)

View file

@ -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,
-- },

View file

@ -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

View file

@ -1,5 +1,2 @@
-- require "ui.window_switcher"
-- require "ui.conductor"
require "ui.statusbar"
-- require "ui.info_center"
require "ui.decorations"

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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 }

View file

@ -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

View file

@ -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" } },

View file

@ -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
}
}

View file

@ -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)

View file

@ -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

View file

@ -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