restructure services, add get_essid to quarrel.native and other wip work
This commit is contained in:
parent
ea1bdf6585
commit
f5612f081d
42
.Xresources
Normal file
42
.Xresources
Normal 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
|
||||
|
Before Width: | Height: | Size: 416 B After Width: | Height: | Size: 416 B |
Before Width: | Height: | Size: 360 B After Width: | Height: | Size: 360 B |
|
@ -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 |
|
@ -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"
|
||||
|
|
|
@ -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,
|
||||
|
|
388
.config/awesome/quarrel/json.lua
Normal file
388
.config/awesome/quarrel/json.lua
Normal 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
|
|
@ -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]
|
||||
|
|
|
@ -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"]
|
||||
|
|
|
@ -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(),
|
||||
};
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
113
.config/awesome/quarrel/native/src/net/mod.rs
Normal file
113
.config/awesome/quarrel/native/src/net/mod.rs
Normal 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"))
|
||||
}
|
104
.config/awesome/quarrel/native/src/net/wireless.rs
Normal file
104
.config/awesome/quarrel/native/src/net/wireless.rs
Normal 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,
|
||||
}
|
|
@ -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<()> {
|
||||
|
||||
}
|
18
.config/awesome/quarrel/service.lua
Normal file
18
.config/awesome/quarrel/service.lua
Normal 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
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
118
.config/awesome/services/common.lua
Normal file
118
.config/awesome/services/common.lua
Normal 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
|
|
@ -1,3 +1,2 @@
|
|||
require "services.battery"
|
||||
require "services.brightness"
|
||||
require "services.wifi"
|
||||
require "services.playerctl"
|
||||
require "services.common"
|
||||
|
|
45
.config/awesome/services/playerctl.lua
Normal file
45
.config/awesome/services/playerctl.lua
Normal 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
|
|
@ -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
|
||||
}
|
|
@ -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
|
|
@ -1,2 +1,2 @@
|
|||
require "ui.decorations.titlebar"
|
||||
require "ui.decorations.wallpaper"
|
||||
-- require "ui.decorations.clippy"
|
||||
|
|
|
@ -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)
|
|
@ -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,
|
||||
-- },
|
||||
|
|
|
@ -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
|
|
@ -1,5 +1,2 @@
|
|||
-- require "ui.window_switcher"
|
||||
-- require "ui.conductor"
|
||||
require "ui.statusbar"
|
||||
-- require "ui.info_center"
|
||||
require "ui.decorations"
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1 @@
|
|||
|
104
.config/awesome/ui/statusbar/panel/widgets/displays.lua
Normal file
104
.config/awesome/ui/statusbar/panel/widgets/displays.lua
Normal 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 }
|
62
.config/awesome/ui/statusbar/panel/widgets/power_menu.lua
Normal file
62
.config/awesome/ui/statusbar/panel/widgets/power_menu.lua
Normal 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
|
|
@ -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" } },
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue