Rewrote backlight manager

master
Mark 2022-04-24 09:10:12 -07:00
parent 0d09d5315f
commit 50ac1bcfcb
Signed by: Mark
GPG Key ID: AD62BB059C2AAEE4
11 changed files with 251 additions and 171 deletions

99
backlight/arc_widget.lua Normal file
View File

@ -0,0 +1,99 @@
local P = {}
function P:set_value(value)
-- Set widget value. (0 - 100)
self.arc.value = value
--[[
if value > 90 then self.icon.image = beautiful.icons.brightness.i
elseif value > 80 then self.icon.image = beautiful.icons.brightness.h
elseif value > 70 then self.icon.image = beautiful.icons.brightness.g
elseif value > 60 then self.icon.image = beautiful.icons.brightness.f
elseif value > 50 then self.icon.image = beautiful.icons.brightness.e
elseif value > 40 then self.icon.image = beautiful.icons.brightness.d
elseif value > 30 then self.icon.image = beautiful.icons.brightness.c
elseif value > 20 then self.icon.image = beautiful.icons.brightness.b
elseif value <= 10 then self.icon.image = beautiful.icons.brightness.a
end
--]]
end
function P:set_state(state)
return
end
function P:set_tooltip(text)
-- Set widget value. (0 - 100)
self.tooltip.text = text
end
function P:new()
widget = {}
setmetatable(widget, self)
self.__index = self
widget.icon = wibox.widget {
id = "icon",
image = beautiful.icons.brightness.i,
resize = true,
widget = wibox.widget.imagebox,
}
widget.arc = wibox.widget {
{
widget.icon,
top = beautiful.dpi(1),
bottom = beautiful.dpi(1),
layout = wibox.container.margin,
},
max_value = 100,
thickness = beautiful.dpi(4),
start_angle = 4.71238898, -- 2pi*3/4
--forced_height = beautiful.dpi(16),
--forced_width = beautiful.dpi(16),
colors = {"#27D4CC", "#00446B"},
bg = "#FFFFFF30",
paddings = beautiful.dpi(2),
widget = wibox.container.arcchart
}
widget.widget = wibox.widget {
{
{ -- Right space
widget = wibox.widget.separator,
color = beautiful.color.transparent,
forced_width = beautiful.dpi(3)
},
{
widget.arc,
top = beautiful.dpi(2),
bottom = beautiful.dpi(2),
layout = wibox.container.margin,
},
{ -- Left space
widget = wibox.widget.separator,
color = beautiful.color.transparent,
forced_width = beautiful.dpi(3)
},
layout = wibox.layout.align.horizontal,
},
layout = wibox.container.background,
}
widget.tooltip = awful.tooltip {
objects = { widget.widget },
text = ""
}
widget.widget:connect_signal("mouse::enter", function(result)
widget.widget.bg = beautiful.color.bar.hover_bg
end)
widget.widget:connect_signal("mouse::leave", function(result)
widget.widget.bg = beautiful.color.transparent
end)
return widget
end
return P

133
backlight/backlight.lua Normal file
View File

@ -0,0 +1,133 @@
local widget_types = {
arc = require("backlight/arc_widget")
}
local P = {}
---
-- Internal methods
---
function P:_get_status()
awful.spawn.easy_async(
script_dir .. "backlight get",
function(stdout, stderr, exitreason, exitcode)
self._ready = true
self.brightness = tonumber(stdout)
self:_update_widget()
end
)
return true
end
function P:_update_widget()
if (not self._ready) then
self.widget:set_state("error")
self.widget:set_value(self.max_value);
self.widget:set_tooltip("Backlight error");
return
end
self.widget:set_value(self.brightness);
self.widget:set_tooltip("Backlight " .. self.brightness .. "u");
self.widget:set_state("ready")
end
---
-- Simple actions
---
function P:backlight_up()
if (not self._ready) or (self.brightness >= self.max_value) then
return
end
awful.spawn(script_dir .. "backlight up 5", false)
self.brightness = self.brightness + 5
if self.brightness > self.max_value then
self.brightness = self.max_value
end
self:_update_widget()
end
function P:backlight_down()
if (not self._ready) or (self.brightness <= self.min_value) then
return
end
awful.spawn(script_dir .. "backlight down 5", false)
self.brightness = self.brightness - 5
if self.brightness < self.min_value then
self.brightness = self.min_value
end
self:_update_widget()
end
function P:backlight_set(value)
if (not self._ready) then
return
end
if (value < self.min_value) then
value = self.min_value
end
if (value > self.max_value) then
value = self.max_value
end
awful.spawn(script_dir .. "backlight set " .. value, false)
self.brightness = value
self:_update_widget()
end
---
-- Create new volume_interface
---
function P:new(args)
-- Arguments
b = {
update_interval = args.update_interal or 5,
min_value = args.min_value or 0,
max_value = args.max_value or 100,
widget_type = args.widget_type or "arc",
_ready = false, -- is all the information in this class up-to-date?
-- if this is false, ui will show an error and most methods will
-- do nothing. Updated in _get_status()
}
b.widget = widget_types[b.widget_type]:new()
b.widget.widget:connect_signal("button::press",
function(_, _, _, button, mods)
-- Scroll up
if (button == 4) then
b:backlight_up()
-- Scroll down
elseif (button == 5) then
b:backlight_down()
end
end
)
setmetatable(b, self)
self.__index = self
-- This timer keeps mute and volume status up-to-date.
b.timer = gears.timer {
timeout = b.update_interval,
call_now = true,
autostart = true,
callback = function()
b:_get_status()
end
}
return b
end
return P

7
backlight/init.lua Normal file
View File

@ -0,0 +1,7 @@
local P = require("backlight/backlight")
local F = function(args)
return P:new(args)
end
return F

View File

@ -1,6 +1,3 @@
dir = configuration_dir .. "bin/"
local script_dir = dir .. "scripts/"
return { return {
system = { system = {
@ -18,26 +15,6 @@ return {
}, },
backlight = { backlight = {
watch = function(timeout, callback, widget)
awful.widget.watch(script_dir .. "backlight get", timeout, callback, widget)
end,
get = function(callback)
awful.spawn.easy_async(script_dir .. "backlight get", callback)
end,
set = function(value)
awful.spawn(script_dir .. "backlight set " .. value, false)
end,
up = function()
awful.spawn(script_dir .. "backlight up", false)
end,
down = function()
awful.spawn(script_dir .. "backlight down", false)
end,
redshift = function(temp) redshift = function(temp)
awful.spawn("redshift -O " .. tostring(temp), false) awful.spawn("redshift -O " .. tostring(temp), false)
end, end,
@ -59,7 +36,7 @@ return {
rofi = { rofi = {
launcher = function() launcher = function()
awful.spawn("rofi -show drun -theme \"" .. dir .. "/rofi/launcher.rasi\"") awful.spawn("rofi -show drun -theme \"" .. bin_dir .. "/rofi/launcher.rasi\"")
end end
}, },

View File

@ -4,6 +4,7 @@
# backlight get # backlight get
# backlight set [value] # backlight set [value]
# backlight max # backlight max
# backlight [up|down] [delta]
# #
# Returns: # Returns:
# Set - nothing # Set - nothing
@ -19,9 +20,9 @@ function backlight
case "set" case "set"
xbacklight -set $argv[2] xbacklight -set $argv[2]
case "up" case "up"
xbacklight -inc 10 xbacklight -inc $argv[2]
case "down" case "down"
xbacklight -dec 10 xbacklight -dec $argv[2]
case "*" case "*"
echo "Unknown function \"$argv[1]\"" echo "Unknown function \"$argv[1]\""
echo "" echo ""

View File

@ -1,7 +1,7 @@
return gears.table.join( return gears.table.join(
awful.key( {}, "XF86MonBrightnessUp", awful.key( {}, "XF86MonBrightnessUp",
function () function ()
wrapper.backlight.up() bck.backlight_up()
end, end,
{ {
description = "Raise brightness", description = "Raise brightness",
@ -11,7 +11,7 @@ return gears.table.join(
awful.key( {}, "XF86MonBrightnessDown", awful.key( {}, "XF86MonBrightnessDown",
function () function ()
wrapper.backlight.down() bck.backlight_down()
end, end,
{ {
description = "Lower brightness", description = "Lower brightness",

View File

@ -47,10 +47,6 @@ local desktop = {
} }
-- Load conditional modules
if conf.backlight_enabled then
desktop.widgets.backlight = require("desktop.widgets.backlight")
end
if conf.battery_enabled then if conf.battery_enabled then
desktop.widgets.battery = require("desktop.widgets.battery") desktop.widgets.battery = require("desktop.widgets.battery")
end end
@ -183,7 +179,7 @@ awful.screen.connect_for_each_screen(
desktop.widgets.space(8), desktop.widgets.space(8),
desktop.widgets.battery, desktop.widgets.battery,
desktop.widgets.backlight, bck.widget.widget,
vol.widget.widget, vol.widget.widget,
desktop.widgets.space(8), desktop.widgets.space(8),

View File

@ -1,101 +0,0 @@
local backlight = {}
backlight.icon = wibox.widget {
id = "icon",
image = beautiful.icons.brightness.i,
resize = true,
widget = wibox.widget.imagebox,
}
backlight.arc = wibox.widget {
{
backlight.icon,
top = beautiful.dpi(1),
bottom = beautiful.dpi(1),
layout = wibox.container.margin,
},
max_value = 100,
thickness = beautiful.dpi(4),
start_angle = 4.71238898, -- 2pi*3/4
--forced_height = beautiful.dpi(16),
--forced_width = beautiful.dpi(16),
colors = {"#27D4CC", "#00446B"},
bg = "#FFFFFF30",
paddings = beautiful.dpi(2),
widget = wibox.container.arcchart
}
backlight.widget = wibox.widget {
{
{ -- Right space
widget = wibox.widget.separator,
color = beautiful.color.transparent,
forced_width = beautiful.dpi(3)
},
{ -- Main indicator. Can be replaced with backlight.arc
backlight.arc,
top = beautiful.dpi(2),
bottom = beautiful.dpi(2),
layout = wibox.container.margin,
},
{ -- Left space
widget = wibox.widget.separator,
color = beautiful.color.transparent,
forced_width = beautiful.dpi(3)
},
layout = wibox.layout.align.horizontal,
},
layout = wibox.container.background,
}
backlight.widget:connect_signal("mouse::enter", function(result)
backlight.widget.bg = beautiful.color.bar.hover_bg
end)
backlight.widget:connect_signal("mouse::leave", function(result)
backlight.widget.bg = beautiful.color.transparent
end)
backlight.widget:connect_signal("button::press",
function(_, _, _, button, mods)
-- Scroll up
if (button == 4) then
wrapper.backlight.up()
-- Scroll down
elseif (button == 5) then
wrapper.backlight.down()
end
end
)
backlight.update = function(value)
backlight.arc.value = value
--[[if value > 90 then backlight.icon.image = beautiful.icons.brightness.i
elseif value > 80 then backlight.icon.image = beautiful.icons.brightness.h
elseif value > 70 then backlight.icon.image = beautiful.icons.brightness.g
elseif value > 60 then backlight.icon.image = beautiful.icons.brightness.f
elseif value > 50 then backlight.icon.image = beautiful.icons.brightness.e
elseif value > 40 then backlight.icon.image = beautiful.icons.brightness.d
elseif value > 30 then backlight.icon.image = beautiful.icons.brightness.c
elseif value > 20 then backlight.icon.image = beautiful.icons.brightness.b
elseif value <= 10 then backlight.icon.image = beautiful.icons.brightness.a end
--]]
end
-- Add various hooks
wrapper.backlight.add_hook(backlight.update)
bin.backlight.watch(
5,
function()
wrapper.backlight.read(backlight.update)
end,
backlight.widget
)
return backlight.widget

5
rc.lua
View File

@ -9,6 +9,8 @@ menubar = require("menubar")
wibox = require("wibox") wibox = require("wibox")
configuration_dir = gears.filesystem.get_configuration_dir() configuration_dir = gears.filesystem.get_configuration_dir()
bin_dir = configuration_dir .. "bin/"
script_dir = bin_dir .. "scripts/"
require("awful.autofocus") require("awful.autofocus")
@ -38,6 +40,9 @@ beautiful.init(require("theme"))
Volume = require("volume") Volume = require("volume")
vol = Volume{pa_sink = conf.pamixer_sink} vol = Volume{pa_sink = conf.pamixer_sink}
Backlight = require("backlight")
bck = Backlight{}
desktop = require("desktop") desktop = require("desktop")

View File

@ -1,36 +0,0 @@
local backlight = {}
backlight.hooks = {}
backlight.add_hook = function(callback)
backlight.hooks[#backlight.hooks + 1] = callback
end
backlight.exec_hooks = function()
backlight.read(function(status)
for i=1, #backlight.hooks do
backlight.hooks[i](status)
end
end)
end
backlight.read = function(callback)
bin.backlight.get(
function(stdout, stderr, exitreason, exitcode)
callback(tonumber(stdout))
end
)
end
backlight.up = function()
bin.backlight.up()
backlight.exec_hooks()
end
backlight.down = function()
bin.backlight.down()
backlight.exec_hooks()
end
return backlight

View File

@ -1,5 +1,4 @@
return { return {
backlight = require("wrapper.backlight"),
sound = require("wrapper.sound"), sound = require("wrapper.sound"),
ibus = require("wrapper.ibus"), ibus = require("wrapper.ibus"),
--mdadm = require("wrapper.mdadm") --mdadm = require("wrapper.mdadm")